Node.js 将CORS模块添加到单个快速路线不起作用
如果是I,来自前端的请求(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
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()
建议?