Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 将CORS模块添加到单个快速路线不起作用_Node.js_Express_Cors - Fatal编程技术网

Node.js 将CORS模块添加到单个快速路线不起作用

Node.js 将CORS模块添加到单个快速路线不起作用,node.js,express,cors,Node.js,Express,Cors,如果是I,来自前端的请求(https://localhost:3000)工作并获取正确的请求头 const express = require('express'); const cors = require('cors'); var app = express(); app.use(cors()); app.post('/api/submitEmail', () => console.log('yay')); 如果我完全按照文档布局,我会在控制台中得到CORS错误 app.post

如果是I,来自前端的请求(
https://localhost:3000
)工作并获取正确的请求头

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

app.use(cors());

app.post('/api/submitEmail', () => console.log('yay'));
如果我完全按照文档布局,我会在控制台中得到CORS错误

app.post('/api/submitEmail', cors(), () => console.log('booooo'));
错误:

Access to XMLHttpRequest at 'http://localhost:8000/api/submitEmail' 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.
我错过了什么

来自前端的整个请求如下所示

const api =
  process.env.NODE_ENV === "development"
    ? "http://localhost:8000"
    : MY_PROD_URL;

const user = {
    email
  };

  axios.post(`${api}/api/submitEmail`, { user }).then(res => {
    setIsLoading(false);
    setValidationMessage(res.data);
  });

您不会向我们显示实际请求的详细信息,但如果请求包含某些特殊条件,则浏览器会在发出POST之前尝试使用选项请求预飞行请求。当您仅在
app.post()
路由处理程序中插入
cors()
调用时,则不会处理选项请求,如果此特定的跨源请求是触发选项飞行前的类型,则由于您不处理它,请求将失败

您可以通过添加以下内容来解决此问题:

app.options('/api/submitEmail', cors(), (req, res) => res.send());
因为这将处理该特定航线的飞行前选项

你可以阅读什么是“简单请求”。除简单请求外,任何其他请求都需要飞行前的选项。它可以简单到设置单个自定义标题或简单请求中不允许的内容类型,这将触发飞行前选项

当你使用(cors())时,自动为您处理飞行前选项请求,因为所有HTTP谓词都被发送到
应用程序。use()
处理程序和
cors()
中间件处理程序支持对选项请求执行正确的操作


另外,在POST请求处理程序中,您需要发送响应,否则客户端将坐在那里等待响应并最终超时。

我也遇到了同样的问题,@jfriend00 answer帮助了我。 您只需包括express应用程序的初始选项:

app.options('/this_is_your_cors_route', cors())
然后您的cors路线将起作用:

app.post('/this_is_your_cors_route', cors(), (req, res) => {});

以下是此问题的文档:

我将整个路线添加到原始问题中,看起来不需要选项请求。@user3521314-由发件人决定是否需要选项请求。显示发送代码。哎哟,替换为来自前端的请求。@user3521314-发送代码不显示任何会触发选项请求的内容(尽管可能在其他地方设置了导致选项请求的axios默认值),但唯一确定的方法是在Chrome调试器的“网络”选项卡中检查实际请求,并查看浏览器实际发送的内容。这还将向您显示它是否首先执行飞行前的选项,并向您显示浏览器从服务器接收到的头信息,以及这是否是您希望的所有信息。@user3521314=Hmm,我在您的详细错误消息中看到,您正在执行飞行前请求,但未在飞行前请求的响应上获得正确的标题。您是否尝试过我的
app.options()
建议?