NodeJS Express和ReactJS的CORS错误[重复]

Posted

技术标签:

【中文标题】NodeJS Express和ReactJS的CORS错误[重复]【英文标题】:CORS error with NodeJS Express and ReactJS [duplicate] 【发布时间】:2019-08-26 15:57:54 【问题描述】:

在此之前,我想说的是,我在 *** 上阅读了大约 12 个类似的问题,但没有一个能帮助我解决我的问题,而且大多数答案都不清楚,所以我相信这个问题是值得一问,我也只是个初学者。

环境:

我有一个在端口3000 上的localhost 上运行的react 应用程序和一个在端口8000 上的Express 服务器。我的服务器:

const express = require('express');
const app = express();

const port = 8000;

app.post('/register', (req, res) => 
    res.send(JSON.stringify(test: 'HELLO!'));
);

const server = app.listen(port, () => console.log('Listening on port', server.address().port));

和客户:

static register(username, password) 
    return fetch('http://localhost:8000/register', 
      method: 'POST',
      body: JSON.stringify(username, password),
      headers: 'Content-Type': 'text/plain'
    ).then(response => console.log(response));
  

发送此请求时,我会收到以下错误消息:

无法加载http://localhost:8000/register:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost:3000' 不允许访问。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。

经过一番研究,我尝试了一些解决方案: 在我的服务器上的“POST”之前添加这个中间件:

app.all('/*', function(req, res, next) 
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
  res.header('Access-Control-Allow-Headers', 'Content-Type');

  next();
);

它没有帮助,所以我尝试了 node CORS 包,但它仍然没有解决我的问题。但是发生了一些变化:我不再收到此错误消息,而是记录了响应,但我没有收到从服务器发送的对象,而是收到了某种“错误对象”:

bodyUsed: false
headers: Headers 
ok: true
redirected: false
status: 200
statusText: "OK"
type: "cors"
url: "http://localhost:8000/register"

但是,当我在 Chrome 中打开一个网络选项卡时,我看到响应是我所期望的 test: HELLO!,因此 Chrome 正在更改某些内容,因此我禁用了 Chrome 安全性,但它仍然在记录相同的错误对象。所以在尝试了所有这些之后,我无法让我的代码工作,所以任何人都可以完全回答如何将请求从 React 应用程序发送到 express 服务器而不会出现 cors 错误?

完整的服务器代码:

const express = require('express');
const cors = require('cors');
const app = express();

const port = 8000;

app.all('/*', function(req, res, next) 
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
  res.header('Access-Control-Allow-Headers', 'Content-Type');

  next();
);

app.post('/register', (req, res) => 
    res.send(JSON.stringify(test: 'HELLO!'));
);

const server = app.listen(port, () => console.log('Listening on port', server.address().port));

【问题讨论】:

您能否展示一下您是如何使用cors 中间件的?因为只要正确设置,您就不应该收到任何与CORS 相关的错误。无论如何,您所在的路由不是设置 CORS 的正确方法,您通常希望在设置 OPTIONS 方法的标头后结束请求。 我已经更新了,我的问题。我已经得到了答案,但是您仍然可以解释一下,为什么这不是设置 CORS 的正确方法,我刚刚开始学习,所以它真的很有帮助。 【参考方案1】:

我认为您的整个请求都运行良好..这就是您收到status: 200 的原因。问题是您如何在客户端处理请求。应该是

static register(username, password) 
    return fetch('http://localhost:8000/register', 
      method: 'POST',
      body: JSON.stringify(username, password),
      headers: 'Content-Type': 'text/plain'
    )
    .then(response => response.json())
    .then(json => console.log(json));
  

您提到的“错误对象”只是完整的响应,其中包含您实际请求的json,以及一些元数据。

【讨论】:

你说得对,它对我有用。谢谢你的回答。

以上是关于NodeJS Express和ReactJS的CORS错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MongoDB + NodeJS Express 向 ReactJS React Router 和 Redux 添加登录身份验证和会话?

带有 reactjs 和 nodejs 的 Shopify 应用程序没有 nextjs?

如何在 reactjs 中向 nodejs RESTful API 发出 POST 请求

如何使用node js,reactjs,express从实际网页中的mongodb中获取数据

部署到 ubuntu 后套接字 io 未连接(nginx、nodejs、reactjs)

NodeJS + Express Cors + SocketIO = XMLHttpRequest 错误