即使我在服务器上允许使用cors,Socket.io也会出现CORS错误

Akh*_*mar 10 node.js cors socket.io

我的节点服务器和客户端在不同的端口上运行(分别为3001,5347).在客户端我用过,

var socket = io('http://127.0.0.1:3001');
Run Code Online (Sandbox Code Playgroud)

在服务器上,我逐一尝试了以下所有内容

    1) io.set('origins', '*:*');
    2) io.set('origins', 'http://127.0.0.1:5347');
    3) io.set('origins', '*');
    4) io.set('origins', '127.0.0.1:5347');
Run Code Online (Sandbox Code Playgroud)

但是我得到了以下错误:

XMLHttpRequest无法加载http://127.0.0.1:3001/socket.io/?EIO=3&transport=polling&t=1456799439856-4590.当credentials标志为true时,不能在'Access-Control-Allow-Origin'标头中使用通配符'*'.因此不允许原点'null'访问.

注意:我在服务器上使用express,我已经按照以下方式使用cors中间件:

app.use(cors());
Run Code Online (Sandbox Code Playgroud)

app和cors分别是express和cors的实例.

Shr*_*ran 37

接受的答案已过时

根据官方文档,您可以将其添加到现有的 http 服务器 https://socket.io/docs/server-initialization/#Attached-to-an-existing-HTTP-server

const server = require('http').createServer();
const options = { /* ... */ };
const io = require('socket.io')(server, options);
io.on('connection', socket => { /* ... */ });
server.listen(3000);
Run Code Online (Sandbox Code Playgroud)

使用此选项对象启用 cors 似乎可以解决问题

options={
 cors:true,
 origins:["http://127.0.0.1:5347"],
}
Run Code Online (Sandbox Code Playgroud)

  • 没有。我也是2020年了,这行不通。这也不是 3.x 的文档所说的,但它所说的 3.x 的操作也不起作用。Socket.io 很糟糕。 (4认同)

Akh*_*mar 27

如果运行Express如下:

var app = express();
var server = app.listen(3000);
Run Code Online (Sandbox Code Playgroud)

所以要启动socket.io,我们可以这样做:

var io = require('socket.io').listen(server);
Run Code Online (Sandbox Code Playgroud)

问题是因为以下代码:

var http = require('http').Server(app);
var io = require('socket.io')(http);
Run Code Online (Sandbox Code Playgroud)

传递给socket.io的服务器对象与我正在侦听的服务器对象不同.

  • 经过几个小时的调试后,这救了我。 (3认同)