访问位于‘...’的XMLHttpRequest.CORS策略已阻止来自源‘localhost:3000’的

2hh7jdfx  于 2022-09-21  发布在  React
关注(0)|答案(9)|浏览(260)

这可能是一个复制品,但我还没有找到一个专门与我的问题有关的帖子。

我正在进行以下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调用按预期工作。然而,当在我的本地机器上进行开发时,它不起作用。不知道我错过了什么。

6ie5vjzr

6ie5vjzr1#

如果您正在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调用,它应该可以工作

628mspwn

628mspwn2#

过了很多天,我终于找到了解决办法。不是像这样简单地使用CORS

const cors = require('cors');

app.use(cors());

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

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

dfddblmv3#

如果服务器没有CORS策略来允许来自您的域的请求,则您不能真正从具有不同主机名的服务器获取数据。

简而言之,除非允许,否则localhost不能调用ipify.org。它似乎不是,我假设服务器不是由您管理的。所以你唯一的选择就是使用反向代理。您可以读取how to create an http proxy with node here

您需要的是让您的应用程序在伪/存根主机上运行,而不是在本地主机上运行:

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

这样,当您进行API调用时,您与ipify.org在同一个域中,不会出现任何CORS问题。

7hiiyaii

7hiiyaii4#

This article很快解决了我的问题。
您可以进行的最快修复是安装moesif CORS extension。安装后,在浏览器中单击它即可激活该扩展。确保图标的标签从“关”变为“开”

bvjveswy

bvjveswy5#

首先,在后端应用程序(如Express应用程序)中,您必须启用cors

喜欢:

1.安装运行命令npm i cors的CORS
1.然后转到server.js或app.js或index.js文件并添加

  • var cors = require('cors');
  • app.use(cors())

3.CORS将使您的客户端或前端应用程序能够访问您的后端路线。最后,转到您的路径,并在Get Routing中粘贴以下行

  • 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个小时,我就这样解决了我的问题。所以希望这能对你有所帮助

xghobddn

xghobddn6#

转到您的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);
  })
nhn9ugyo

nhn9ugyo7#

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

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

wgmfuz8q

wgmfuz8q8#

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

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

x8goxv8g9#

我只在Crome浏览器上遇到了这个问题,而在Crome浏览器上,我有多次登录扩展。当我删除此扩展时,此问题已修复。

相关问题