Socket.io 跨域问题 - Access-Control-Allow-Origin 不允许来源

Posted

技术标签:

【中文标题】Socket.io 跨域问题 - Access-Control-Allow-Origin 不允许来源【英文标题】:Socket.io cross-domain issue - Origin is not allowed by Access-Control-Allow-Origin 【发布时间】:2012-08-10 04:33:48 【问题描述】:

我在 url (example.com) 有一个网站,并且正在使用 node.js/socket.io 将 JSON 传递到我的网页中。我目前收到一条错误消息:“XMLHttpRequest 无法加载 http://example.com:12003/socket.io/1//897026922693503087/?disconnect=1。Access-Control-Allow-Origin 不允许来源 http://example.com。”

我的节点代码如下所示:

   var http = require('http');
   var mysqlClient = require('mysql').createClient('user':'root','password':'XXXXXXXX');

   mysqlClient.query('USE myDBName');

   var mysqlData;

   setInterval(function()
       mysqlClient.query(
                      'SELECT number, page_id FROM dbTableName',
                      function selectCb(err, results, fields) 
                        if (err) 
                          throw err;
                  

                mysqlData = [];
           for(var i = 0; i < results.length; i++)
               mysqlData[i] = results[i];
           
       );  
   , 1000);

   var io = require('socket.io').listen(12003);
   io.sockets.on('connection', function(client) 

       console.log("New Connection: ", client.id); //log new connection

             client.emit('connection', client.id);//custom emit to let site know its connected
            client.on("requestNewData", function(data)
                client.emit('init', JSON.stringify(mysqlData));
       );

       client.on('disconnect', function() 
        console.log("Disconnected: ", client.id);
       );
   );

我试过这行代码来解决这个问题,但没有成功:

          var io = require('socket.io').listen(12003, origins: '*:*');

我在带有 Ubuntu Ocelot 的 Amazon EC2 上运行。我的客户端代码是:

          <script src="http://example.com:12003/socket.io/socket.io.js"></script>
          <script type="text/javascript">
              var socket = io.connect('http://example.com:12003');
              socket.emit("requestNewData", "nothing":"here");
              ...

由于我只是使用套接字,我认为我不能在我的节点代码中使用 'Access-Control-Allow-Origin' : '*' 。任何帮助将不胜感激。我收到的错误仅在 Chrome 上 - 据我了解,Chrome 对跨域连接的限制更大......

提前致谢。

【问题讨论】:

你有没有找到解决这个问题的方法?我看到的完全一样。 【参考方案1】:

尝试在客户端只包含你的 socket.io 的相对路径:

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

【讨论】:

这不起作用...我现在收到以下错误:GET example.com/socket.io/socket.io.js 404 (Not Found) Uncaught ReferenceError: io is not defined。我认为这是因为当我的套接字信息位于端口 12003 上时,它正在查看端口 80。还有其他想法...? 我回家后看看 一有机会就告诉我...我仍然无法找到解决方案...

以上是关于Socket.io 跨域问题 - Access-Control-Allow-Origin 不允许来源的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 跨域问题

跨域 Sails.js + Socket.io 授权

跨域socket.io 30秒后中断

vue-socket.io跨域问题的解决方法

Socket.io 跨域问题 - Access-Control-Allow-Origin 不允许来源

如何针对跨域的 PHP 会话 ID 对 Socket.IO 进行身份验证