nestjs + socket.io, обслуживающий веб-сокеты из микросервиса по вложенному пути вместо корня хоста, всегда возвращает 404 Not Found

Я использую реализацию socket.io с nestjs. Моя общая производственная архитектура полагается на балансировщик нагрузки для маршрутизации запросов по путям к контейнерам микросервисов.

Один из них содержит веб-сокет, который взаимодействует с пользовательскими данными и вложен в mydomain.com/apis/user

На моем шлюзе я настроил его на использование этого пути:

      @WebSocketGateway({ path: "/apis/user/gateway", namespace: "/apis/user/gateway" })

и я пробовал варианты без пространства имен и только с путем.

Еще у меня есть глобальный префикс: app.setGlobalPrefix("apis/user"); удаление этого не имеет значения, кажется, мне нужно определить путь к шлюзу в любом случае с префиксом или нет.

Затем на клиенте я пытаюсь просто подключиться к нему, добавив путь в URL-адрес или к объекту параметров, как таковой:

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

    socket = io(endpoint, {
      secure: true,
      path: "/apis/user/gateway",
    });

Это работает для триггеров path и handleConnection на вложенном в них шлюзе, однако настройка опроса на бэкэнде не работает, клиент по-прежнему выдает:

       https://example.com/apis/user/gateway/?EIO=4&transport=polling&t=NXVpMfB 404 Not Found

1 ответ

У меня была такая же проблема, все различные варианты сбивают с толку. Я разобрался, вот что сработало:

Для гнезд:

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

Для socket.io:

      const newSocket = io("http://localhost:3000/api/v1/ws", {
      path: "/api/v1/ws/socket.io",
    });
Другие вопросы по тегам