2

我有一个可以工作的 node.js Express 服务器,我想向它添加 socket.io 支持(允许 javascript 客户端通过 socket.io 连接)。我可以通过 Javascript $.get() 连接到 express 服务器,但是由于 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 日志中正确地看到了“信息:socket.io 已启动”。

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

    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 的标头 - 两者都正确返回了(应该)允许跨域请求的标头...

访问控制允许来源:*

在此处输入图像描述

有任何想法吗?

4

1 回答 1

0

CORS 是一件非常棘手的事情(或者至少对我来说是这样)。我在这里推荐这个资源:http: //enable-cors.org/

遵循他们所做的非常仔细地帮助了我。我还发现不同的浏览器对 CORS 请求/响应提供了不同的可见性,这有帮助。

我发现 Chrome 比 firefox 更容易上手,但 firefox 工具(例如 firebug)使用起来非常好。

从您的信息中我的直觉是,您可能需要您的请求在请求属性中包含 X-Request-With。

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

我绝对建议尝试将问题分成两半,以便您可以查看是服务器端还是客户端的行为不符合您的预期。

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

于 2013-01-20T22:01:40.097 回答