【问题标题】:socket.io, 'Access-Control-Allow-Origin' errorsocket.io,“访问控制允许来源”错误
【发布时间】:2017-11-21 12:57:39
【问题描述】:

我已经设置了一个带有套接字 io 的节点服务器,并尝试通过另一台服务器连接到它。 然而,不同计算机上的一些浏览器给了我这个错误,并让它一直重新连接:

XMLHttpRequest 无法加载 https://serverDomain.net:3000/socket.io/?EIO=3&transport=polling&t=Lo_SdiU。当请求的凭据模式为“包含”时,响应中的“Access-Control-Allow-Origin”标头的值不能是通配符“*”。因此,Origin 'https://www.differentServerDomain.fr' 不允许访问。 XMLHttpRequest 发起的请求的凭证模式由 withCredentials 属性控制。

我的 js 配置:

var port = 3000;
var fs = require('fs');
var https = require('https');
var express = require('express');
var app = express();

var options = {
    key: fs.readFileSync('/etc/letsencrypt/live/devpeter.net/privkey.pem'),
    cert: fs.readFileSync('/etc/letsencrypt/live/devpeter.net/fullchain.pem')
};
var server = https.createServer(options, app);
var io = require('socket.io')(server);
io.origins('https://www.differentServerDomain.fr:* https://www.differentServerDomain.fr/wp-admin/index.php:*');

// start of server
server.listen(port, function(){
    console.log('listening on *: '+ port + "\n");
});

我正在使用节点 8.0 和套接字 io 2.2, 非常感谢您的帮助。

编辑: 这是客户端代码:

<script src="https://serverDomain.net:3000/socket.io/socket.io.js"></script>
<script>
   var socket = io('https://serverDomain.net:3000');
</script>

【问题讨论】:

    标签: javascript node.js socket.io cors


    【解决方案1】:

    我找到了解决办法。 出于某种原因,并非所有服务器都允许使用默认传输方式。

    所以我在客户端指定了一种中立的运输方式,像这样:

    var socket = io('https://yourDomain:3000', { transports : ['websocket'] });
    

    【讨论】:

    • transport 对我不起作用,transports 对我有用。我正在使用 socket.io-client 3.1.2
    • 这将禁用 HTTP 长轮询传输,由于实际原因,socket-io 文档不建议这样做。更多信息可here
    • 终于找到了。甚至官方的 socket.io 文档句柄 cors 也没有帮助 socket.io/docs/v3/handling-cors
    【解决方案2】:

    在客户端指定以下内容。

    const socket = io('https://yourDomain:3000', { transports: ['websocket'] });

    而不是const socket = io('https://yourDomain:3000');

    【讨论】:

      【解决方案3】:

      这对我有用

      var socket = io('http://yourDomain:port', { transports: ['websocket', 'polling', 'flashsocket'] });
      

      【讨论】:

      • 这个对我有用。谢谢!
      • 这个对我有用 2,谢谢
      【解决方案4】:

      我最近遇到了同样的问题,对我有用的解决方案如下:

      //在React项目中安装socket.io-client然后

      import io from 'socket.io-client'   
      
      var socket = io('http://localhost:<your_port_number>', {transports: ['websocket', 'polling', 'flashsocket']});
      

      【讨论】:

      • 试了很多很多,最后这段代码很有帮助,非常感谢
      • 非常欢迎@samita :) 祝你有美好的一天!
      【解决方案5】:

      试试这个,它对我有用:

      const io = require("socket.io")(httpServer, {
        cors: {
          origin: "http://localhost:8080",
          methods: ["GET", "POST"]
        }
      });
      

      【讨论】:

        【解决方案6】:

        在客户端代码中添加这个,我得到错误“NO Access-Control-Allow-Origin' header is present”。所以在客户端添加了这个。

        var connectionOptions =  {
                    "force new connection" : true,
                    "reconnectionAttempts": "Infinity", 
                    "timeout" : 10000,                  
                    "transports" : ["websocket"]
                };
        
                this.socket = io.connect('http://localhost:5000',connectionOptions);

        【讨论】:

          【解决方案7】:

          Socekt io v3

          的用户

          您需要在服务器配置的cors 选项中使用选项credentials

          例子:

          const io = require('socket.io')(strapi.server, {
            cors: {
              origin: "http://localhost:3000",
              credentials: true
            }
          });
          

          文档:

          https://expressjs.com/en/resources/middleware/cors.html https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin

          相关话题:

          Socket.io + Node.js Cross-Origin Request Blocked

          迁移指南

          https://socket.io/docs/v3/migrating-from-2-x-to-3-0/index.html#CORS-handling

          【讨论】:

          • 它对我有用。我真的很感激,丹尼尔。
          【解决方案8】:

          另外请检查是否有此消息“info - unhandled socket.io url”的服务器端日志。如果显示,请将您的 socket.io 版本升级到 1.0+。我用这种方法解决了。

          npm install socket.io@1.0

          或像这样更改 package.json:

          "dependencies": {
              "socket.io": "^1.0"
          }
          

          【讨论】:

          • 感谢您的回答 licaomeng,但是我有一些功能依赖于 2.0+ 版本的 socket io。无论如何,明确声明协议到 websocket 的传输方法对我来说是这样做的(请参阅接受的答案)。
          【解决方案9】:

          希望这次修改对你有所帮助。

              var port = 3000;
              var fs = require('fs');
              var https = require('https');
              var express = require('express');
              var app = express();
          
              app.use(function(req, res, next) {
                res.header("Access-Control-Allow-Origin", "https://www.differentServerDomain.fr https://www.differentServerDomain.fr");
                res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
                next();
              });
          
          
              var options = {
                  key: fs.readFileSync('/etc/letsencrypt/live/devpeter.net/privkey.pem'),
                  cert: fs.readFileSync('/etc/letsencrypt/live/devpeter.net/fullchain.pem')
              };
              var server = https.createServer(options, app);
              var io = require('socket.io')(server);
          
              // start of server
              server.listen(port, function(){
                  console.log('listening on *: '+ port + "\n");
              });
          

          【讨论】:

          • 没有更改任何内容,不断断开重新连接并出现相同的 XMLHttpRequest 错误。谢谢你的尝试。
          猜你喜欢
          • 2013-03-02
          • 1970-01-01
          • 2017-01-10
          • 1970-01-01
          • 2019-07-09
          相关资源
          最近更新 更多