Как получить доступ к сокету.идентификатор клиента ввода-вывода от контроллера NestJS?

#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.