Веб-сайты NestJS выгоняют пользователя из комнаты

#angular #typescript #websocket #socket.io #nestjs

Вопрос:

Я изучал веб-сайты в NestJS и Angular, и в настоящее время я застрял на проблеме: выгнать пользователя из комнаты.

Во-первых, я не знаю, правильно ли я соединяю комнату (возможно, я делаю слишком много шагов).

Это мой процесс:

  • Угловой интерфейс: пользователь нажимает кнопку присоединиться к комнате, и выполняется следующий код:
 this.roomService  .joinRoom(room.id, password)  .pipe(take(1))  .subscribe((connected: boolean) =gt; {  if (connected) {  this.socketService.joinRoom(room.id);  this.router.navigate([`lobby/${room.id}`]);  }  });   

Во-первых, гостиная ( this.roomService.joinRoom(room.id, password) ) Выполняется вызов API, который на сервере NestJS добавляет пользователя в массив списка игроков в документ комнаты в базу данных. Затем сервер сокетов отправляет roomChanged событие в идентификатор комнаты. После этого angular отправляет запрос на присоединение к комнате сокетов ( this.socketService.joinRoom(room.id) ), где клиент фактически присоединяется к комнате сокетов ( client.join(roomId) ) на серверной части. Было бы лучше просто позвонить this.socketService.joinRoom(room.id) , что также добавило бы пользователя в список игроков (так же, как this.roomService.joinRoom(room.id, password) вызов API), что уменьшило бы количество вызовов API с 2 до 1, но в этом случае я мог бы удалить joinRoom конечную точку, так как шлюз справится с этим.

joinRoom Конечная точка API:

 @UseGuards(JwtAuthGuard)  @Patch('join/:id')  public async joinRoom(  @Request() req: any,  @Body('password') password: string,  @Param('id') id: string,  ): Promiselt;booleangt; {  const result = await this.roomService.joinRoom(id, req.user.id, password);   if (result) {  this.socketService.server.to(id).emit('roomChanged', 'hello from server');  }   return result;  }  

joinRoom обработчик шлюза:

 @SubscribeMessage('joinRoom')  public handleJoinRoom(client: Socket, roomId: string): void {  client.join(roomId);  client.emit('joinedRoom', roomId);  }  

Код, который у меня есть, стал проблемой, потому что я не знаю, как выгнать пользователя. В настоящее время я нигде не сохраняю идентификаторы клиентов, должен ли я сохранять идентификаторы клиентов в базе данных и показывать их администратору комнаты или как мне подойти к реализации пинка пользователя?