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

时间:2013-01-20 21:44:30

标签: node.js socket.io

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

我的测试机器是带有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和localhost - 两者都正确地返回了(应该)允许跨域请求的标题......

Access-Control-Allow-Origin:*

enter image description here

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

CORS是一个非常欺骗性的工作(或者至少对我而言)。我在此推荐此资源:http://enable-cors.org/

他们的行为非常谨慎地帮助了我。我还发现不同的浏览器对CORS请求/响应有不同的可见性,这有助于。

我发现Chrome比firefox更容易上手,但是像firebug这样的firefoxes工具非常适合使用。

我的直觉是,您可能需要在请求属性中提出X-Request-With。

我还发现使用fidler发送http请求允许我最初将问题缩小到服务器端并使其正常工作。你会发现浏览器强制执行CORS,但是像fidler这样的东西却没有,因此提供了另一种检查正在发生的事情的方法。

我肯定建议尝试将问题分成两半,以便您可以查看服务器端或客户端是否表现不如您期望。

我的问题与为POST或GET返回OPTIONS标题的相同CORS响应有关。那是错的。 Chrome允许它。 Firefox没有。发出的任何选项请求都将被发送一次,然后将来它将被缓存而不是重新发送(这最初对我造成了很多混淆)。对于选项请求,您只需要一个标准响应,说它可以继续,然后在帖子或获得响应我相信你只希望你的cors响应。