Nestjs + socket.io 在嵌套路径而不是主机的根目录中从微服务提供 websockets 总是返回 404 Not Found

Mic*_*elB 7 websocket socket.io nestjs nestjs-gateways

我正在将 socket.io 实现与 Nestjs 一起使用。我的整体生产架构依赖于负载均衡器将请求路由到微服务容器的路径上。

其中之一包含一个与用户数据交互的 websocket,并嵌套在mydomain.com/apis/user

在我的网关上,我已将其配置为使用此路径:

@WebSocketGateway({ path: "/apis/user/gateway", namespace: "/apis/user/gateway" })
Run Code Online (Sandbox Code Playgroud)

我尝试过没有命名空间而只有路径的变体。

我还有一个全局前缀: app.setGlobalPrefix("apis/user");删除它没有什么区别,看来我需要定义网关的路径,无论是否为前缀。

然后在客户端上,我尝试通过在 url 中添加路径或选项对象来连接到它,如下所示:

    const endpoint = "https://example.com/apis/user/gateway";

    socket = io(endpoint, {
      secure: true,
      path: "/apis/user/gateway",
    });
Run Code Online (Sandbox Code Playgroud)

这适用于嵌套在那里的网关上的路径和handleConnection触发器,但是在后端配置轮询不起作用,客户端仍然抛出:

 https://example.com/apis/user/gateway/?EIO=4&transport=polling&t=NXVpMfB 404 Not Found
Run Code Online (Sandbox Code Playgroud)

chr*_*arx 4

我遇到了同样的问题,所有不同的选项都很令人困惑。我已经把它整理好了,这就是有效的:

对于nestjs:

@WebSocketGateway({
  cors: {
    origin: '*',
  },
  namespace: '/api/v1/ws',
  path: '/api/v1/ws/socket.io',
})
Run Code Online (Sandbox Code Playgroud)

对于socket.io:

const newSocket = io("http://localhost:3000/api/v1/ws", {
      path: "/api/v1/ws/socket.io",
    });
Run Code Online (Sandbox Code Playgroud)