#socket.io #nestjs
#socket.io #гнездышко
Вопрос:
Я разрабатываю поддержку чатов на веб-сайтах. Я использую агрегатор чатов, и это не мой личный сервис. Итак, каждый раз, когда приходит какое-либо сообщение от службы поддержки, я получаю его в своем контроллере, и задача состоит в том, чтобы передать это сообщение моему клиенту через websockets
. Проблема в том, что я не могу отправить сообщение в определенный сокет, поэтому мне нужно знать его идентификатор. Имея следующий код:
@Controller('chat') export class ChatController { @UseInterceptors(CamelCaseConverterInterceptor) @Post() getExternalMessage( @Body() payload: WebhookChatMessageDto, @ConnectedSocket() client: Socket, ): void { ... code } }
Я хочу получить идентификатор текущего клиента сокета, но, похоже @ConnectedSocket()
, декоратор не работает в контроллерах. Есть какие-нибудь идеи?
Ответ №1:
вам не нужно использовать декоратор в методах вашего контроллера. Первый параметр-сокет, второй-полезная нагрузка. Так что в вашем методе:
getExternalMessage( client: Socket, payload: WebhookChatMessageDto, ): void { console.log(client.id); //client id client.emit(...); //emit to this client }
но если вы хотите использовать конечные точки websocket, это должно быть не @Post (), а @SubscribeMessage(«someMessage»). В запросе post вы никогда не сможете получить доступ к клиенту сокета, потому что это связь через другой порт, и вы не можете связать запрос post с сокетом пользователей.подключение ввода-вывода
Комментарии:
1. этот код, похоже, не работает (я не могу удалить
@Post
декоратор, так как внешний источник отправляетpost
мне запрос). Итак, если я не могу получить доступ к экземпляру сокета в контроллере-что мне делать?2. нет, я этого не говорил 🙂 Вы МОЖЕТЕ получить доступ к экземпляру сокета в своем бэкэнде. Но вы не можете найти сокет клиента. ио клиентИд. Если вам нужно реализовать этот почтовый маршрут, вам нужно добавить дополнительный параметр, в который клиент отправляет свой идентификатор клиента. Чем этот параметр будет не сокетом, а простой строкой. И вы должны найти подходящего клиента из своего сокета по этой строке
3. Что ты имеешь в виду? Я удалил
@ConnectedSocket()
декоратора, и, похоже, параметр клиента становится неопределенным. Если этого не сделать, я получу неправильный экземпляр (экземпляр IncomingMessage)…4. просто удалите параметр клиента из вашего метода. Это будет
getExternalMessage(@Body() payload: WebhookChatMessageDto)
и расширение webhookchatmessaged для добавления нового ключа, например socketId: string. Это должно отправить интерфейс на ваш сервер. После этого вам нужно найти этот идентификатор сокета в экземпляре сервера сокетов для получения экземпляра клиента5. нет-нет-нет,
external source/message
— это агрегатор чатов, и это вообще не моя услуга. Я не могу отправить идентификатор сокета из этой службы, потому что у меня нет на это никаких разрешений. Моя внешняя сторона также не может отправить запрос на эту конечную точку из-за моей политики cors.