我有一个工作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:*
有什么想法吗?
答案 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响应。