Node.js 正在获取express server以接受CORS请求
我的express服务器正在运行http://localhost:3000 (我称之为web服务器) 我在本地主机上运行了另一个应用程序:8100(我称之为“应用程序”) 当我的应用程序调用Web服务器时,我收到以下消息: “XmlHttpRequest无法加载http://localhost:3000/auth/facebook. 对飞行前请求的响应未通过访问控制检查。当凭据标志为true时,“访问控制允许来源”中不能使用通配符“*”。来源'http://localhost:81000“因此不允许使用acecss” 此消息显示在浏览器控制台中 我在我的节点Web服务器的中间件中设置了以下选项Node.js 正在获取express server以接受CORS请求,node.js,express,cors,Node.js,Express,Cors,我的express服务器正在运行http://localhost:3000 (我称之为web服务器) 我在本地主机上运行了另一个应用程序:8100(我称之为“应用程序”) 当我的应用程序调用Web服务器时,我收到以下消息: “XmlHttpRequest无法加载http://localhost:3000/auth/facebook. 对飞行前请求的响应未通过访问控制检查。当凭据标志为true时,“访问控制允许来源”中不能使用通配符“*”。来源'http://localhost:81000“因此
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT, POST,DELETE');
在阅读了几个stackoverfow问题后,我还添加了以下内容:
res.header('Access-Control-Allow-Origin', 'http://localhost:8100');
但是,这并不能解决问题。我个人更喜欢这个模块。代码非常简单:
var whitelist = [
'http://0.0.0.0:3000',
];
var corsOptions = {
origin: function(origin, callback){
var originIsWhitelisted = whitelist.indexOf(origin) !== -1;
callback(null, originIsWhitelisted);
},
credentials: true
};
app.use(cors(corsOptions));
您还需要在标题中允许
选项
方法
我有一个cors中间件:
module.exports = function (req, res, next) {
// CORS headers
res.header("Access-Control-Allow-Origin", "YOUR_URL"); // restrict it to the required domain
res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS");
// Set custom headers for CORS
res.header("Access-Control-Allow-Headers", "Content-type,Accept,X-Custom-Header");
if (req.method === "OPTIONS") {
return res.status(200).end();
}
return next();
};
PS.您得到的错误是由于跨来源请求是如何工作的。长话短说,浏览器可能首先使用方法OPTIONS
发送pre-flight
请求,以获取允许的来源、标题和方法。因此,对于这个请求,您应该只返回访问控制-*
头。如果飞行前
运行正常,浏览器将继续执行原始请求
您可以找到更多信息。显然cors模块不起作用 使用上面给出的提示,我使用了以下代码:
if (req.method === "OPTIONS") {
res.header('Access-Control-Allow-Origin', req.headers.origin);
} else {
res.header('Access-Control-Allow-Origin', '*');
}
这就成功了。我也有同样的问题,绊倒了大约一个小时。解决方案其实很简单——只需为启用CORS即可
我使用cors并实现它,所以它非常简单
var-cors=require('cors')代码>
app.use(cors({origin:true,credentials:true}))代码>我以为我以前破解过这个,但一旦我从IIS切换回IIS Express,我又开始出现错误
我再次开始谷歌搜索,并尝试了许多建议,包括上面的建议,但在我找到这篇文章之前,这些建议都不起作用,其中提出了以下建议:
res.header('Access-Control-Allow-Origin', 'http://localhost:8100');
将以下两行添加到
部分下的
部分:
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
最终结果应如下所示:
<httpProtocol>
<customHeaders>
<clear />
<add name="X-Powered-By" value="ASP.NET" />
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
<redirectHeaders>
<clear />
</redirectHeaders>
</httpProtocol>
这对我来说很好,但请注意,在IIS中运行时,我不需要上述内容。您还必须考虑飞行前的请求。我建议您在项目中添加“cors”npm包,并从以下配置开始:
const cors=require('cors');
应用程序使用(cors)({
证书:正确,
preflightContinue:true,
方法:['GET','POST','PUT','PATCH','DELETE','OPTIONS'],
来源:真实
});
这将使用列出的方法对任何地址启用跨源请求。Origin参数非常灵活,您可以分隔一组地址,例如,所有地址或按regex分隔。以下是包文档:
您还需要允许访问控制允许方法中的选项
方法
我建议按照Thomas的建议使用cors模块,而不是处理标题内容。它易于设置和使用。解决一般问题需要30秒。结合runtimeZero if else代码,这对我来说非常有效!更多详细信息事实上,CORS的处理需要在其他路由之前被包括在内,这对我有很大帮助。谢谢!if(req.method==“OPTIONS”)
是meThis缺少的工作。简单明了。你只需要“npm安装CORS”就可以了。这是接受所有源代码的最佳解决方案,因为源代码:“*”不起作用
<httpProtocol>
<customHeaders>
<clear />
<add name="X-Powered-By" value="ASP.NET" />
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
<redirectHeaders>
<clear />
</redirectHeaders>
</httpProtocol>