socket.io,'Access-Control-Allow-Origin'错误

时间:2017-06-19 10:40:25

标签: javascript node.js socket.io cors

我已经设置了一个节点服务器,其中socket io转向并尝试通过另一台服务器连接到它。 但是,不同计算机上的某些浏览器会给我这个错误并使其在整个时间内重新连接:

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

my js config:

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和socket io 2.2, 非常感谢您的帮助。

编辑: 这是客户端代码:

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

10 个答案:

答案 0 :(得分:22)

这对我有用

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

答案 1 :(得分:4)

对于 Socekt io v3

的用户

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

示例:

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

答案 2 :(得分:4)

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

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

import io from 'socket.io-client'   

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

答案 3 :(得分:3)

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

所以我在客户端指定了一种中立的运输方式,如下所示:

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

答案 4 :(得分:0)

希望这项修改能为您提供帮助。

    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");
    });

答案 5 :(得分:0)

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

npm install socket.io@1.0

或像这样更改package.json:

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

答案 6 :(得分:0)

我已经在Chrome中下载了Moesif Origin&CORS Changer扩展程序并启用了它。

答案 7 :(得分:0)

尝试一下,它对我有用:

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

答案 8 :(得分:0)

在客户端指定以下内容。

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

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

答案 9 :(得分:-1)

在客户端代码中添加此错误,出现错误“不存在Access-Control-Allow-Origin'标头”。因此将其添加到客户端。

var connectionOptions =  {
            "force new connection" : true,
            "reconnectionAttempts": "Infinity", 
            "timeout" : 10000,                  
            "transports" : ["websocket"]
        };

        this.socket = io.connect('http://localhost:5000',connectionOptions);