Socket.io访问控制允许=来自远程站点的原始错误

我正尝试从另一个站点访问一个socket.io服务器。 它工作了几个星期,但现在我不断收到以下错误。 从heroku服务器访问节点上的服务器时会发生这种情况。 错误是:

XMLHttpRequest cannot load http://site2.nodester.com/socket.io/xhr-polling//1311008802545. Origin http://site1.heroku.com is not allowed by Access-Control-Allow-Origin. Resource interpreted as Script but transferred with MIME type text/plain. Uncaught SyntaxError: Unexpected identifier 

以下是我如何连接到套接字:

 socket = new io.Socket( 'site2.nodester.com', {port: 80, rememberTransport: false} ); 

这里是服务器代码:

 // requires server = http.createServer(function(req, res){ // server stuffs }), server.listen(8362); var io = io.listen(server), // io code 

你configuration了 socket.io仍然使用默认的origins = *或至less把origins = site1.heroku.com

我面临的问题是,从不同的位置服务于客户端socket.io.js。

您可以通过从您尝试连接的服务器上提供客户端js文件来避免此问题。

例如,我最初的客户端代码是这个,它是抛出错误

 <script src="/socket.io/socket.io.js"></script> var socket = io.connect('http://mydomain.com/'); 

一旦我修改到这一点,它工作正常。

 <script src="http://mydomain.com/socket.io/socket.io.js"></script> var socket = io.connect('http://mydomain.com/'); 

而我的服务器代码是,

 var express = require('express'); var app = express(); app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); res.header("Access-Control-Allow-Headers", "Content-Type"); res.header("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS"); next(); }); var server = http.createServer(app); io = socketio.listen(server, {log:false, origins:'*:*'}); ... //io.connect and events below 

我有同样的问题,我不能解决。

我testing了很多configuration:

  io.set("origins","*"); io.set('transports', [ 'websocket' , 'flashsocket' , 'htmlfile' , 'xhr-polling' , 'jsonp-polling' ]); 

要么

  io.set("origins = *"); io.set('transports', [ 'websocket' , 'flashsocket' , 'htmlfile' , 'xhr-polling' , 'jsonp-polling' ]); 

要么

 var socket = io.listen(appS1,{origins: '*:*'}); 

感谢你的帮助:)

这可能不完全相关,但最终可能会帮助一些可怜的灵魂在这个问题上:

我刚刚遇到了从本地磁盘运行客户端(至less在Windows上),例如。 file:///c:/...产生一个“空”的原点,这会使原点检查崩溃。 尝试上传客户端到远程网站,并从那里开火。 离开起点

希望这可以帮助一些人。

这对我有效

 var app = require('express')() , server = require('http').createServer(app) , sio = require('socket.io'); var io = sio.listen(server, { origins: '*:*' }); 

我通过从服务器本身加载客户端的socket.io.js解决了这个问题,而不是在网站上维护一个本地副本。 在我的设置中,某个网站上有一个网页,它从位于不同位置的服务器获取文件。

一个简单的解决方法(感谢mattcodez ):

io = io.listen(8888); io.server.removeListener('request', io.server.listeners('request')[0]);

这个问题有一个开放的错误,你可以在这里阅读更多关于它的信息 :

我通过更改一行客户端代码来解决这个问题。

我变了

 var socket = io('localhost'); 

 var socket = io();