即使我在服务器上允许Cors,Socket.io也给出CORS错误

我的节点服务器和客户端运行在不同的端口(分别为3001,5347)。 在我用过的客户端上,

var socket = io('http://127.0.0.1:3001'); 

在服务器上,我尝试了一个接一个

  1) io.set('origins', '*:*'); 2) io.set('origins', 'http://127.0.0.1:5347'); 3) io.set('origins', '*'); 4) io.set('origins', '127.0.0.1:5347'); 

但是我得到以下错误:

XMLHttpRequest无法加载http://127.0.0.1:3001/socket.io/?EIO=3&transport=polling&t=1456799439856-4590 。 当凭证标志为真时,通配符“*”不能在“Access-Control-Allow-Origin”头中使用。 原因'null'因此不被允许访问。

注意:我在服务器上使用快递,我已经按以下方式使用了Cors中间件:

 app.use(cors()); 

app和cors分别是express和cors的实例。

如果运行Express如下:

 var app = express(); var server = app.listen(3000); 

因此,要启动socket.io,我们可以做到:

 var io = require('socket.io').listen(server); 

问题是由于以下代码:

 var http = require('http').Server(app); var io = require('socket.io')(http); 

传递给socket.io的服务器对象与我正在监听的服务器对象不一样。

错误说…

原因'null'因此不被允许访问。

主机头是否在请求中设置?

设置主机头应该可以解决这个问题

您需要configuration节点服务器,以使Access-Control-Allow-Origin标头的值回显到Origin请求标头的值。 看到这部分的错误信息:

当凭证标志为真时,通配符“*”不能在“Access-Control-Allow-Origin”头中使用。 原因'null'因此不被允许访问。

您在请求中发送凭证(在底层请求中使用XHR + withCredentials或Fetch + credentials ),在这种情况下, Access-Control-Allow-Origin响应头的值必须与Origin值在请求头。


所有这一切,如果服务器说起源的null ,似乎你不能testing你的应用程序加载它从Web服务器,但直接从文件系统,所以它结束了一个file:// URL。

如果是这样,你可能真的不想这样testing,而应该在本地运行一个Web服务器,并在testing时加载你的应用程序。

如果你使用的是Express,那么在你的服务启动代码之前定义一个这样的中间件…

 app.use(function(request, response, next) { response.header("Access-Control-Allow-Origin", "*"); response.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); });