Node.js服务器中的 socket.io:不存在"访问控制允许源"标头



我有一个服务器也建立套接字。io服务器。

我正在运行docker-compose up,服务器和客户端都出现了,服务器在0.0.0.0:8000和客户端在0.0.0.0:3000中工作,但套接字连接不工作。

运行后端的端口将docker ps视为0.0.0.0:8000-8001->8000-8001/tcp

我从控制台的应用程序中得到错误:

Access to XMLHttpRequest at 'http://0.0.0.0:8001/socket.io/?
EIO=4&transport=polling&t=NiQWpj0' from origin 'http://<IP-WHERE-APP-RUNNING>:3000' has been
blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

在没有容器的本地计算机上运行它可以工作。

对于如何解决这个问题有什么建议吗?server.js

var express = require('express');
var app = express();
var multer = require('multer')
var cors = require('cors');
var path = require('path');
// Setup socket connection with clien
const io = require('socket.io')(8001, {
cors: {
origin: '*',
}
});
const sockets = {}
var socketInstance = null
io.on("connection", socket => {
socket.on("connectInit", function() {
// The socket ID is stored
sockets[socket.id] = socket
socketInstance = socket
socket.on('disconnect', function() {
delete sockets[socket.id];
});
// The sockets object is stored in Express so it can be grabbed in a route
app.set("sockets", sockets)
})
});
// The io instance is set in Express so it can be grabbed in a route
app.set("io", io)
app.use(cors())
...
...

客户端:

import io from 'socket.io-client';
// Set up socket connection with server
const socket = io('ws://0.0.0.0:8001', { // localhost:8001 in case running locally
'sync disconnect on unload': true,
});
socket.emit('connectInit');
export default socket;

:

我已经试过了:

// Setup socket connection with clien
const io = require('socket.io')(8001, {
cors: {
origin: 'http://<IP-WHERE-APP-RUNNING>:3000',
}
});

如https://socket.io/docs/v4/handling-cors/所建议,但无济于事

在我的具体情况下,答案是把<IP-WHERE-APP-RUNNING>0.0.0.0的地方。ip是运行这些容器的远程虚拟机。我本来可以更清楚,但服务器和应用程序都在同一个VM中运行。

我仍然在开发服务器上运行react应用程序,所以我不知道事情会如何发展。

帮助我的是回答和使用curl:

没有& # 39;Access-Control-Allow-Origin& # 39;当试图从REST API获取数据时

使用的curl命令:

curl -H "Origin: <IP-WHERE-CONTAINERS-RUN>:3000" --verbose 
<IP-WHERE-CONTAINERS-RUN>:8000

在这里,我希望得到CORS选项作为响应。

在未来,我似乎需要使用反向代理,如这里所建议的可接受的答案:

访问控制源报头错误使用Axios在React Web抛出错误在Chrome

相关内容

最新更新