【问题标题】:Access to XMLHttpRequest at '...' from origin 'localhost:3000' has been blocked by CORS policyCORS 策略已阻止从源“localhost:3000”访问“...”处的 XMLHttpRequest
【发布时间】:2019-11-22 08:43:20
【问题描述】:

这可能是重复的,但我还没有找到专门与我的问题相关的线程。

我正在进行以下 API 调用:

const config = {
  headers: {
    "Access-Control-Allow-Origin": "*",
    "Access-Control-Allow-Methods": "GET,PUT,POST,DELETE,PATCH,OPTIONS"
  }
};

const {
  data: { ip }
} = await axios.get("https://api.ipify.org?format=json", config);

这会引发错误:

Access to XMLHttpRequest at 'https://api.ipify.org/?format=json' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

当我将应用部署到 Heroku 时,API 调用按预期工作。但是,在我的本地机器上开发时它不起作用。不知道我在这里缺少什么。

【问题讨论】:

标签: reactjs cors axios


【解决方案1】:

经过很多天我终于找到了解决方案。而不是像这样简单地使用 CORS

const cors = require('cors');

app.use(cors());

在您的服务器 index.js 中使用 CORS 选项将解决问题,现在您可以传递 cookie 或其他凭据

const cors = require('cors');
const corsOptions ={
    origin:'http://localhost:3000', 
    credentials:true,            //access-control-allow-credentials:true
    optionSuccessStatus:200
}
app.use(cors(corsOptions));

【讨论】:

    【解决方案2】:

    转到您的 package.json 文件并添加: “proxy”:“your-api-url”,但只是开头/基础,例如,如果您使用 pokemon api,您只需设置“proxy”:“https://pokeapi.co/api/v2 " 在您的服务文件中,您可以将 axios 与您需要的路径一起使用:

    axios.get("/pokemon?limit=1000")
      .then(response => {
        resolve(response.data.results);
      })
    

    【讨论】:

    • 如果您使用 2 个 API 会怎样?它如何理解它将从哪个 API 获取信息?
    【解决方案3】:

    首先,在您的后端应用(如快递应用)中,您必须启用cors

    喜欢:

    1. 运行命令npm i cors安装cors
    2. 然后转到您的 server.js 或 app.js 或 index.js 文件并添加
    • var cors = require('cors');
    • app.use(cors())

    3.cors 将使您的客户端或前端应用程序能够访问您的后端路由。最后去你的路线和里面得到路线粘贴以下几行

    • router.get("/", (req, res) => {
    • res.setHeader("Access-Control-Allow-Origin", "*")
    • res.setHeader("Access-Control-Allow-Credentials", "true");
    • res.setHeader("Access-Control-Max-Age", "1800");
    • res.setHeader("Access-Control-Allow-Headers", "content-type");
    • res.setHeader( "Access-Control-Allow-Methods", "PUT, POST, GET, DELETE, PATCH, OPTIONS" );
    • });

    ` 我也面临这个问题2个小时,我解决了我的问题。所以希望这会对你有所帮助

    【讨论】:

    • 是的,它在我的 MERN 堆栈应用程序中对我有用......我希望这也可以帮助你
    【解决方案4】:

    这可能是由于在 development 模式下来自 react 应用程序的 POST 请求。您可以通过在 ' 文件中添加以下代码行来绕过开发模式下的 CORS 策略。

    {
        ...
        "proxy": "http://localhost:3000",
        ...
    }
    

    【讨论】:

    • 这个 sn-p 应该放在哪个文件中?
    • 什么时候生产?
    • 脚本区域中的 package.json 文件 "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts测试”,“弹出”:“反应脚本弹出”,“服务器”:“json-server -p3001 --watch db.json”,“代理”:“localhost:3000”},
    【解决方案5】:

    This article 很快解决了我的问题。

    您可以做出的最快修复是安装 moesif CORS extension 。安装后,在浏览器中单击它以激活扩展程序。确保图标的标签从“关闭”变为“开启”

    【讨论】:

      【解决方案6】:

      如果你在 nodejs 中构建你的 rest api。按照以下简单步骤操作

      停止 Node.js 服务器。

      npm install cors --save
      

      将以下行添加到您的 server.js 或 index.js

      var cors = require('cors')
      
      app.use(cors()) // Use this after the variable declaration
      

      现在尝试在客户端进行 api 调用,它应该可以工作

      【讨论】:

      • 该帖子的作者指出他正在从私有域 ipify.org 中提取数据。作者不拥有该公司/网站/api,因此此解决方案没有任何意义,因为此解决方案适用于作者实际上可以控制 API 服务的不同场景
      • 即使这是一个不正确的答案,在我看来这不是删除的原因。正如我们从upvotes 中看到的那样,有些人发现它很有用。
      • 在我的情况下,我在后端执行此操作。仍然无法正常工作。我使用 Node 作为后端,在前端使用 React。前端代码看起来像这样。 export default axios.create({ baseURL: "http://localhost/3001/api/v1/restaurants" }); 在其他组件中,我正在像这样获取 const response = await RestaurantApi.get("/") ; 我仍然收到错误。
      【解决方案7】:

      您无法真正从没有 CORS 策略以允许来自您的域的请求的主机名不同的服务器获取数据。

      简单来说,localhost 不能调用 ipify.org,除非它允许。似乎没有,我假设服务器不是由您管理的。因此,您唯一的选择是使用反向代理。你可以阅读how to create an http proxy with node here

      你需要让你的应用在一个假的/存根的主机上提供服务,而不是本地主机:

      local.development.ipify.org -> 代理到localhost:3000

      这样,当您进行 api 调用时,您与 ipify.org 在同一个域下,并且您不会遇到任何 CORS 问题。

      【讨论】:

      • 你能解释一下 Node 在这里是如何相关的吗?该调用适用于 Heroku 应用程序,但不适用于我的本地主机。我需要用 React 创建一个 http 代理吗?还是必须是节点?我的 Node 后端甚至在任何时候都没有到达,因为来自前端的 axios 调用在尝试与后端通信之前失败
      • 重要的是反向代理。 Node 并不真正相关,您可以使用任何您想要创建反向代理的工具,甚至是 Nginx。您想要的是您的应用程序不在本地主机上提供服务,而是在存根子域上提供服务。我会更新我的答案。
      【解决方案8】:

      您似乎试图做的是告诉服务器它应该使用您在 Axios 调用中指定的 CORS 策略。这根本不是事情的工作方式——服务器定义了自己的 CORS 策略,您只需遵守它们。如果您尝试访问的服务器在其 CORS 策略中不支持 http://localhost:3000,则您无法将该源与 API 一起使用。

      如果服务器是您的,请查看cors 包并将其配置为允许localhost:3000 作为来源。如果您不拥有该服务器,则在不询问服务器所有者是否愿意这样做的情况下,您无法真正更改任何 CORS 策略。

      【讨论】:

      • 它工作!感谢您在 CORS 包中介绍我们
      猜你喜欢
      • 2021-03-08
      • 1970-01-01
      • 2020-11-11
      • 2021-04-12
      • 2021-12-18
      • 2021-10-05
      • 2023-03-09
      • 2019-10-30
      相关资源
      最近更新 更多