#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); }
Код, который у меня есть, стал проблемой, потому что я не знаю, как выгнать пользователя. В настоящее время я нигде не сохраняю идентификаторы клиентов, должен ли я сохранять идентификаторы клиентов в базе данных и показывать их администратору комнаты или как мне подойти к реализации пинка пользователя?