处理 React 中的 API 错误:CORS 插件挑战
使用 API 时 ReactJS开发人员经常会遇到与数据获取相关的各种挑战,尤其是在处理第三方 API 时。出现的一个常见问题是“未处理的拒绝(类型错误):无法获取”错误。即使使用流行的 API(例如 Swiggy 的餐厅列表 API)(许多开发人员使用该 API 来增强其 Web 应用程序),也可能会发生此错误。
在这种情况下,添加 CORS Chrome 扩展程序似乎是绕过限制性浏览器策略的可行解决方案。然而,它可能会带来新的复杂性,而不是解决问题。如果您在开发环境中使用 CORS 插件,并且您的 API 请求在加载后不久就失败,则可能会遇到插件与浏览器的请求处理行为发生冲突的问题。
了解如何管理跨域请求并排除故障 CORS 错误 ReactJS 对于顺利的开发过程至关重要。像 Swiggy 这样的 API 通常具有安全层(例如 CORS)来控制未经授权的客户端的访问。这些限制可能会导致需要正确解决的错误。
在本指南中,我们将探讨为什么会出现此错误,特别是在 Chrome 中添加 CORS 插件之后。我们还将讨论在您的环境中使用 Swiggy API 时解决该问题的策略。 反应 应用程序。
命令 | 使用示例 |
---|---|
fetch() | 此命令用于向 Swiggy API 发出 HTTP 请求。它异步获取资源并返回一个承诺,该承诺解析为 Response 对象。它是从 API 检索餐厅数据的关键。 |
useEffect() | 在 React 中使用,该钩子允许在渲染组件后执行 API 调用等副作用。它确保在安装组件后立即发出对 Swiggy 的 API 的获取请求。 |
res.setHeader() | 此 Express 命令设置自定义 HTTP 标头,例如 访问控制允许来源,这对于 CORS 处理至关重要。它使后端能够允许来自任何来源的请求,从而防止 CORS 错误。 |
res.json() | 此方法用于将 JSON 响应发送回客户端。在代理服务器解决方案中,它确保从 Swiggy 获取的 API 数据以 JSON 格式返回,前端可以轻松使用。 |
await | 此关键字暂停异步函数的执行,直到获取操作解析,确保代码在继续之前等待 API 的数据,从而防止未处理的拒绝。 |
express() | 这 表达() 函数用于创建 Express 服务器的实例。该服务器充当前端和 Swiggy API 之间的代理,以防止数据获取期间出现 CORS 问题。 |
app.listen() | 此命令使 Express 服务器开始侦听指定端口(例如本例中的端口 5000)上的传入请求。在开发过程中,在本地托管代理服务器至关重要。 |
try...catch | 此块处理提取请求期间可能发生的错误,例如网络故障或 Swiggy API 问题。它确保应用程序优雅地处理错误而不是崩溃。 |
使用 Swiggy API 解释 React 中 CORS 问题的解决方案
在第一个解决方案中,我们创建了一个 Node.js 后端从 Swiggy 的 API 获取餐厅数据时使用 Express 绕过 CORS 问题。 CORS 策略阻止浏览器向其他域发出请求,除非该域允许。通过创建一个简单的服务器,我们可以充当客户端和 API 之间的中间层,获取服务器端的数据并将其返回到 React 前端。此方法可以避免 CORS 错误,因为请求来自与客户端应用程序相同的来源。
Express 后端设置自定义标头,特别是 访问控制允许来源,这允许我们的客户请求资源而不会面临 CORS 限制。对 Swiggy 的 API 的获取调用是在服务器端进行的,数据以 JSON 格式返回。这种方法通常被认为在生产环境中更安全、更高效,因为它隐藏了 API 密钥或敏感信息。此外,使用 try-catch 可确保正确的错误处理,并在 API 无法响应时显示用户友好的错误消息。
在第二种解决方案中,我们修改了客户端 React 代码上的 fetch 请求。此方法涉及在获取调用中添加自定义标头,确保请求在到达 API 之前格式正确。我们使用React的 使用效果 挂载组件时触发 API 调用的钩子。异步函数等待 API 响应,将其转换为 JSON,并在请求失败时处理错误。然而,如果API不允许直接来自浏览器的跨域请求,该解决方案仍然面临CORS问题。
最后,在第三种解决方案中,我们使用了名为 CORS-Anywhere 的第三方服务。这是一种中间件服务,可通过其服务器重新路由 API 请求,从而暂时帮助绕过 CORS 限制。虽然该解决方案可以在开发环境中工作,但由于安全风险和对外部服务的依赖,不建议用于生产环境。它还引入了性能开销,因为它为数据获取过程添加了一个附加层。在测试阶段使用此方法可能很方便,但出于安全原因应避免在生产中使用。
解决方案 1:使用代理服务器处理 CORS 问题
该解决方案使用 Node.js 后端代理服务器来避免 CORS 错误并正确从 Swiggy API 获取数据。
const express = require('express');
const fetch = require('node-fetch');
const app = express();
const port = 5000;
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET');
next();
});
app.get('/restaurants', async (req, res) => {
try {
const response = await fetch('https://www.swiggy.com/dapi/restaurants/list/v5?lat=23.1685786&lng=79.9338798');
const data = await response.json();
res.json(data);
} catch (err) {
res.status(500).json({ error: 'Failed to fetch restaurants' });
}
});
app.listen(port, () => {
console.log(`Server running on http://localhost:${port}`);
});
解决方案 2:使用带有自定义标头和错误处理的前端获取
这种方法直接在 React 中修改 fetch 请求,添加自定义标头并有效处理错误。
import React, { useEffect } from 'react';
const Body = () => {
async function getRestaurants() {
try {
const response = await fetch(
'https://www.swiggy.com/dapi/restaurants/list/v5?lat=23.1685786&lng=79.9338798',
{ headers: { 'Content-Type': 'application/json' } }
);
if (!response.ok) {
throw new Error('Network response was not ok');
}
const data = await response.json();
console.log(data);
} catch (error) {
console.error('Fetch error:', error);
}
}
useEffect(() => {
getRestaurants();
}, []);
};
export default Body;
方案三:使用CORS-Anywhere中间件进行开发
此方法使用“CORS-Anywhere”服务在开发模式下绕过 CORS 限制。该解决方案不应在生产中使用。
const Body = () => {
async function getRestaurants() {
try {
const response = await fetch(
'https://cors-anywhere.herokuapp.com/https://www.swiggy.com/dapi/restaurants/list/v5?lat=23.1685786&lng=79.9338798'
);
const data = await response.json();
console.log(data);
} catch (error) {
console.error('Error fetching restaurants:', error);
}
}
useEffect(() => {
getRestaurants();
}, []);
};
export default Body;
排查 API 请求中的 CORS 问题
React 应用程序中出现“无法获取”错误的根本原因之一,尤其是在使用 Swiggy 等第三方 API 时,是 跨域资源共享 (跨源资源共享)限制。 CORS 是一项安全功能,可限制 Web 应用程序向与其提供服务的域不同的域发出请求。在这种情况下,Swiggy API 会拒绝该请求,因为它来自不同的域(您的 React 应用程序)。当您从不明确支持跨源请求的 API 获取数据时,这尤其成问题。
常见的解决方法是使用浏览器扩展程序,例如“允许 CORS”Chrome 扩展程序。然而,这样的扩展可能会导致不一致的结果。这是因为它们操纵的浏览器级别设置并不总是与 API 请求正确同步。理想情况下,这些插件应仅用于开发,而不应用于生产环境。对于生产,更安全、更可靠的方法是使用后端代理服务器代表您的 React 应用程序请求数据,如前面提供的解决方案所示。
另一个需要考虑的方面是有效地处理错误。虽然 CORS 问题是“无法获取”错误的常见原因,但网络不稳定、API URL 不正确或服务器停机等其他因素也可能导致此错误。因此,实施很重要 强大的错误处理 在您的代码中,尤其是在使用第三方 API 时。正确的错误处理机制将有助于更有效地调试问题,并在出现问题时提供用户友好的消息。
关于 React 中 CORS 和 API 请求的常见问题
- 什么是 CORS?为什么它很重要?
- CORS(跨源资源共享)是浏览器强制执行的安全策略,用于防止来自不受信任域的恶意请求。它确保只允许某些域从服务器获取资源。
- 为什么我收到“未处理的拒绝(类型错误):无法获取”?
- 当您的 API 请求由于 CORS 限制而被阻止时,通常会发生此错误。它也可能是由不正确的 API URL 或服务器问题引起的。
- 什么是 useEffect 钩子在这种情况下做什么?
- 这 useEffect React中的hook用于在组件挂载后触发API请求。它确保获取操作在正确的时间发生,从而防止多个不必要的请求。
- 如何修复 React 应用程序中的 CORS 错误?
- 要修复 CORS 错误,您可以使用后端代理,设置正确的标头 res.setHeader 在服务器中,或依赖 CORS-Anywhere 等服务进行开发。
- 我可以在生产中使用 CORS 浏览器扩展吗?
- 不可以,CORS 浏览器扩展只能用于开发。在生产中,在服务器上配置 CORS 或使用代理服务器更安全。
关于在 React 中管理 CORS 错误的最终想法
在开发使用第三方 API 的 React 应用程序时,CORS 错误是一个常见的挑战。尽管浏览器扩展可以帮助开发,但在生产环境中实施更可靠的解决方案(例如代理服务器)以维护安全性和数据完整性至关重要。
通过使用正确的技术(例如错误处理和后端解决方案),开发人员可以有效地处理“无法获取”等问题。这确保了他们的应用程序在与 API 交互时提供流畅的用户体验,从而增强性能和功能。
了解 React 中 CORS 问题的参考资料和源材料
- 有关跨源资源共享(CORS)以及如何在 React 中管理它的详细信息,请参阅 CORS 上的 MDN Web 文档 。
- 要了解有关常见 React 错误(例如“无法获取”)和潜在解决方案的更多信息,请检查 关于错误边界的 React 文档 。
- 如果您正在使用 Express 设置代理服务器来绕过 CORS 问题,请访问 Express.js 路由和中间件 。
- 有关如何在 JavaScript 中使用 Fetch API 的帮助,请参阅 有关 Fetch API 的 MDN Web 文档 。
- 在官方 API 文档中探索如何使用 Swiggy 的 API 获取餐厅数据: Swiggy API 。