socket.io 在 node.js 服务器中:不存在 'Access-Control-Allow-Origin' header
socket.io in node.js server: No 'Access-Control-Allow-Origin' header is present
我有一台服务器也建立了socket.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 是一个远程虚拟机,其中这些容器 运行ning。我本来可以更清楚,但服务器和应用程序都 运行 在同一个虚拟机中。
我还在运行在开发服务器中安装 React 应用程序,所以我不知道接下来会怎样。
回答和使用 curl 对我有帮助:
我使用的 curl 命令:
curl -H "Origin: <IP-WHERE-CONTAINERS-RUN>:3000" --verbose \
<IP-WHERE-CONTAINERS-RUN>:8000
在这里我希望获得 CORS 选项作为响应。
将来我似乎需要按照已接受答案中的建议使用反向代理:
我有一台服务器也建立了socket.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 是一个远程虚拟机,其中这些容器 运行ning。我本来可以更清楚,但服务器和应用程序都 运行 在同一个虚拟机中。
我还在运行在开发服务器中安装 React 应用程序,所以我不知道接下来会怎样。
回答和使用 curl 对我有帮助:
我使用的 curl 命令:
curl -H "Origin: <IP-WHERE-CONTAINERS-RUN>:3000" --verbose \
<IP-WHERE-CONTAINERS-RUN>:8000
在这里我希望获得 CORS 选项作为响应。
将来我似乎需要按照已接受答案中的建议使用反向代理: