angular - NestJS Websockets 将用户踢出房间
问题描述
我一直在学习 NestJS 和 Angular 中的 websocket,目前我遇到了一个问题:将用户踢出房间。
首先,我不知道我是否正确地加入了房间(我可能做了太多的步骤)。
这是我的过程:
- Angular 前端:用户点击加入房间按钮,执行以下代码:
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
端点,如网关会处理这个问题。
joinRoom
API端点:
@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 保存到数据库中,并将它们显示给房间管理员,或者我如何实现用户踢?
解决方案
推荐阅读
- snowflake-cloud-data-platform - 将有效负载中的空字符串类型转换为雪花中的 int
- javascript - 如何查找在物化模式中单击了哪个按钮?
- r - solve.default(oout$hessian) 中的错误:Lapack 例程 dgesv:系统完全是奇异的:U[1,1] = 0
- node.js - Heroku 在获取图像时崩溃
- c# - 从 StringBuilder 输出中删除空白列表项而不会丢失订单
- raspberry-pi - Makfile ERROR: make: ../objects/%.o:: No such file or directory
- vue.js - ncaught TypeError:不能使用'in'运算符在未定义的vue路由器中搜索'path'
- c++ - 运行分布在三个不同目录中的 C++ 程序
- python - Python将随机数写入和读取到文件
- google-sheets - 将运行总计添加到 Google 表格中的查询