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

lol*_*101 13 javascript node.js cors socket.io

我已经设置了一个带有套接字 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");
});
Run Code Online (Sandbox Code Playgroud)

我正在使用 node 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>
Run Code Online (Sandbox Code Playgroud)

lol*_*101 31

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

所以我在客户端指定了一个中立的传输方法,如下所示:

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

  • “交通”对我不起作用,“交通”却对我有用。我正在使用 socket.io-client 3.1.2 (14认同)

小智 26

这对我有用

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


Dan*_*iel 20

对于Socekt io v3 的用户

您需要credentialscors服务器配置选项中使用选项。

例子:

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

文档:

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 跨域请求被阻止

迁移指南

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


小智 10

在客户端代码中添加这个,我收到错误“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);
Run Code Online (Sandbox Code Playgroud)


小智 6

在客户端指定以下内容。

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

代替const socket = io('https://yourDomain:3000');


小智 5

试试这个,它对我有用:

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


小智 5

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

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

import io from 'socket.io-client'   

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