本地主机上的Socket.io + Express CORS错误(Access-Control-Allow-Origin不允许)

我有一个工作node.js快递服务器,我将添加socket.io支持(允许JavaScript客户端通过socket.io连接)。 我可以通过Javascript $ .get()连接到express服务器,但是由于CORS错误,socket.io.connect()命令失败。

我的testing机器是带有Apache的OSX服务客户端,因此端口80被占用,所以我有端口8888上运行的node.js / express。我按照文档添加了socket.io:

var exp = express(); var server = require('http').createServer(api.server); exp.listen(8888); var io = require('socket.io').listen(server); io.sockets.on('connection', function(socket) { console.log('connection'); }); 

我在我的node.js日志中正确地看到“info:socket.io started”。

然后,在客户端上,我尝试连接到服务器…

  this.socket = io.connect('http://localhost:8888'); this.socket.on('connect',function() { socket.emit('install','test'); }); 

但是,我在Chrome中的控制台中收到CORS错误:

 XMLHttpRequest cannot load http://localhost:8888/socket.io/1/?t=1358715637192. Origin http://localhost is not allowed by Access-Control-Allow-Origin. 

不过,这个工作正常!

  $.get('http://localhost:8888',function(e,d){ console.log(e,d); }); 

所以我再次检查我的头,为localhost:8888和本地主机 – 都正确返回(应)允许跨域请求的标头…

Access-Control-Allow-Origin:*

在这里输入图像说明

有任何想法吗?

CORS是一个非常欺骗的工作(或者至less是为了我)。 我在这里推荐这个资源: http : //enable-cors.org/

遵循他们所做的非常认真的帮助我。 我还发现,不同的浏览器对CORS请求/响应的帮助不同。

我发现Chrome比firefox更容易工作,但是像firebug这样的firefox工具可以很好地工作。

我从你的信息中感觉到,你可能需要你的请求在你的请求属性中有一个X-Request-With。

我还发现使用Fidler发送http请求,可以让我将问题缩小到服务器端,并使其工作。 你会发现浏览器强制执行CORS,但是像Fidler这样的东西没有,从而提供了另一种方式来检查正在发生的事情。

我绝对build议试图将问题分解成一半,以便您可以看到服务器端或客户端是否不符合您的预期。

我的问题是与POST或GET返回相同的CORS响应的OPTIONS头。 那是错的。 Chrome允许它。 Firefox没有。 任何发送出去的选项请求都会被发送出去,将来会被caching起来而不会被重新发送(这对我最初造成了很大的困扰)。 对于选项请求,你只需要一个标准的回应,说可以继续,然后在post或获得回应,我相信你只需要你的Cors回应。