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",
});