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 ps0.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 选项作为响应。

将来我似乎需要按照已接受答案中的建议使用反向代理: