Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.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 正在获取express server以接受CORS请求_Node.js_Express_Cors - Fatal编程技术网

Node.js 正在获取express server以接受CORS请求

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“因此

我的express服务器正在运行http://localhost:3000 (我称之为web服务器) 我在本地主机上运行了另一个应用程序:8100(我称之为“应用程序”)

当我的应用程序调用Web服务器时,我收到以下消息:

“XmlHttpRequest无法加载http://localhost:3000/auth/facebook. 对飞行前请求的响应未通过访问控制检查。当凭据标志为true时,“访问控制允许来源”中不能使用通配符“*”。来源'http://localhost:81000“因此不允许使用acecss”

此消息显示在浏览器控制台中

我在我的节点Web服务器的中间件中设置了以下选项

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>