ReactJS:添加Chrome CORS插件后,未处理的拒绝(TypeError)无法获取

Temp mail SuperHeros
ReactJS:添加Chrome CORS插件后,未处理的拒绝(TypeError)无法获取
ReactJS:添加Chrome CORS插件后,未处理的拒绝(TypeError)无法获取

处理 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 请求的常见问题

  1. 什么是 CORS?为什么它很重要?
  2. CORS(跨源资源共享)是浏览器强制执行的安全策略,用于防止来自不受信任域的恶意请求。它确保只允许某些域从服务器获取资源。
  3. 为什么我收到“未处理的拒绝(类型错误):无法获取”?
  4. 当您的 API 请求由于 CORS 限制而被阻止时,通常会发生此错误。它也可能是由不正确的 API URL 或服务器问题引起的。
  5. 什么是 useEffect 钩子在这种情况下做什么?
  6. useEffect React中的hook用于在组件挂载后触发API请求。它确保获取操作在正确的时间发生,从而防止多个不必要的请求。
  7. 如何修复 React 应用程序中的 CORS 错误?
  8. 要修复 CORS 错误,您可以使用后端代理,设置正确的标头 res.setHeader 在服务器中,或依赖 CORS-Anywhere 等服务进行开发。
  9. 我可以在生产中使用 CORS 浏览器扩展吗?
  10. 不可以,CORS 浏览器扩展只能用于开发。在生产中,在服务器上配置 CORS 或使用代理服务器更安全。

关于在 React 中管理 CORS 错误的最终想法

在开发使用第三方 API 的 React 应用程序时,CORS 错误是一个常见的挑战。尽管浏览器扩展可以帮助开发,但在生产环境中实施更可靠的解决方案(例如代理服务器)以维护安全性和数据完整性至关重要。

通过使用正确的技术(例如错误处理和后端解决方案),开发人员可以有效地处理“无法获取”等问题。这确保了他们的应用程序在与 API 交互时提供流畅的用户体验,从而增强性能和功能。

了解 React 中 CORS 问题的参考资料和源材料
  1. 有关跨源资源共享(CORS)以及如何在 React 中管理它的详细信息,请参阅 CORS 上的 MDN Web 文档
  2. 要了解有关常见 React 错误(例如“无法获取”)和潜在解决方案的更多信息,请检查 关于错误边界的 React 文档
  3. 如果您正在使用 Express 设置代理服务器来绕过 CORS 问题,请访问 Express.js 路由和中间件
  4. 有关如何在 JavaScript 中使用 Fetch API 的帮助,请参阅 有关 Fetch API 的 MDN Web 文档
  5. 在官方 API 文档中探索如何使用 Swiggy 的 API 获取餐厅数据: Swiggy API