首页 文章

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

提问于
浏览
2

我有一个工作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); 
    });

所以我仔细检查了我的 Headers ,对于localhost:8888和localhost - 两者都正确地返回了(应该)允许跨域请求的标头...

Access-Control-Allow-Origin:*

enter image description here

有任何想法吗?

1 回答

  • 0

    CORS是一个非常欺骗性的工作(或者至少它适合我) . 我在这里推荐这个资源:http://enable-cors.org/

    他们所做的非常谨慎地帮助了我 . 我还发现不同的浏览器对CORS请求/响应提供了不同的可见性 .

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

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

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

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

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

相关问题