首页 > 解决方案 > NestJS Websockets 将用户踢出房间

问题描述

我一直在学习 NestJS 和 Angular 中的 websocket,目前我遇到了一个问题:将用户踢出房间。

首先,我不知道我是否正确地加入了房间(我可能做了太多的步骤)。

这是我的过程:

    this.roomService
      .joinRoom(room.id, password)
      .pipe(take(1))
      .subscribe((connected: boolean) => {
        if (connected) {
          this.socketService.joinRoom(room.id);
          this.router.navigate([`lobby/${room.id}`]);
        }
      });

首先,执行 joinRoom ( this.roomService.joinRoom(room.id, password)) API 调用,在 NestJS 服务器上将用户添加到 playerList 数组中,并将房间文档添加到数据库中。然后套接字服务器roomChanged向房间 ID 发出一个事件。之后,Angular 发送一个加入套接字房间(this.socketService.joinRoom(room.id))的请求,客户端实际上是client.join(roomId)在后端加入套接字房间( )。只调用 会更好this.socketService.joinRoom(room.id),这也会将用户添加到 playerList(与this.roomService.joinRoom(room.id, password)API 调用相同),这会将 API 调用从 2 减少到 1,但在这种情况下,我可以删除joinRoom端点,如网关会处理这个问题。

joinRoomAPI端点:

  @UseGuards(JwtAuthGuard)
  @Patch('join/:id')
  public async joinRoom(
    @Request() req: any,
    @Body('password') password: string,
    @Param('id') id: string,
  ): Promise<boolean> {
    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);
  }

我的代码成了问题,因为我不知道踢用户的方法。目前,我没有在任何地方保存客户端 ID,我应该将客户端 ID 保存到数据库中,并将它们显示给房间管理员,或者我如何实现用户踢?

标签: angulartypescriptwebsocketsocket.ionestjs

解决方案


推荐阅读