如何获取 HTTP 请求,然后与网关提供商共享信息。 Nest.js

问题描述 投票:0回答:1

任务:
我正在尝试获取用户离开聊天室的 HTTP 请求。此信息应该在此聊天中与其他人共享。更准确地说,一步一步:

  1. 用户点击“离开房间X-姓名-房间”按钮;
  2. 前端发送HTTP请求;
  3. 这是一些允许用户离开房间的逻辑
  4. HTTP 控制器将有关 HTTP 请求的信息传输到 websocket 服务(Nest.Gateway)
  5. Ws服务向房间的参与者发送消息“user-leave-a-room”事件;
  6. HTTP 响应被发送给离开房间的用户。

问题:
我找不到有关 Nest.Controller 和 Nest.Gateways(ws) 之间数据交换的信息。

先决条件:
现在我只通过 Websocket 事件来做到这一点。但在这种情况下,用户界面无法知道用户离开房间的确切时间。 (可以通过 Promise 等待 HTTP 请求,而 websocket 事件则不能)。

非常感谢您的回答。

express nestjs backend state-management
1个回答
0
投票

因此,您正在尝试创建一种流畅的体验,当用户单击“离开房间”按钮时,后端会立即知道,同时房间中的其他人都会收到此人留下的备忘录。棘手的部分是在 HTTP 请求和 WebSocket 事件之间实现sync,对吧?让我们深入探讨如何使用 NestJS 来实现这一目标。

第 1 步:控制器管理 HTTP 请求

当用户点击“离开房间”时,前端会向服务器发送一个 HTTP 请求,以发出信号:“嘿,该用户想要出去!”这是所有leave room逻辑都位于HTTP Controller中的地方。一旦该请求到达后端,您就可以处理它。

以下是它在控制器中的外观:

@Controller('chat')
export class ChatController {
  constructor(private readonly chatService: ChatService) {}

  @Post('leave-room')
  async leaveRoom(@Body() leaveRoomDto: LeaveRoomDto) {
    const { userId, roomName } = leaveRoomDto;

    // Handle the user leaving the room in the service
    await this.chatService.leaveRoom(userId, roomName);

    // Tell the WebSocket Gateway that someone has left the room
    this.chatService.notifyRoomLeave(userId, roomName);

    // Finally, respond back to the user who left the room
    return { message: `You have left room ${roomName}` };
  }
}

事情是这样的:

  • HTTP 控制器等待用户的请求,处理逻辑(将用户从房间中删除),然后调用服务来通知 WebSocket 网关该用户已退出。
  • 等待
    leaveRoom
    逻辑,以便UI知道确切何时用户已成功离开房间。这样,HTTP 响应就会告诉用户:“是的,你已经出局了。”

第 2 步:服务桥接 HTTP 和 WebSocket 世界

现在,在服务中,您不仅处理将用户移出房间的逻辑,还通知 WebSocket Gateway。该服务本质上就像中间人一样 - 一旦用户被删除,它就会触发 WebSocket 告诉房间里的其他人有关更改的信息。

这是正在运行的服务:

@Injectable()
export class ChatService {
  constructor(private readonly chatGateway: ChatGateway) {}

  async leaveRoom(userId: string, roomName: string) {
    // Logic to remove the user from the room (e.g., update DB, remove from room data)
  }

  notifyRoomLeave(userId: string, roomName: string) {
    // Inform the WebSocket Gateway that the user has left
    this.chatGateway.userLeftRoom(userId, roomName);
  }
}
  • 该服务通过处理用户退出逻辑来完成“繁重的工作”,然后触发 WebSocket 通知其他参与者。
  • notifyRoomLeave
  • 函数调用
    WebSocket Gateway
    ,该网关将事件广播给该房间中的所有客户端。
  • 第 3 步:
WebSocket 网关通知所有人

现在,是时候让

WebSocket Gateway

发挥它的魔力了。一旦服务告诉它“嘿,这个用户离开了”,网关就会向房间里的其他人发送一条消息。 以下是在 WebSocket 网关中处理该问题的方法:

@WebSocketGateway() export class ChatGateway { @WebSocketServer() server; userLeftRoom(userId: string, roomName: string) { // Broadcast the 'user-leave-a-room' event to everyone in the room this.server.to(roomName).emit('user-leave-a-room', { userId, roomName }); } }

WebSocket 服务器向该特定房间中的所有用户广播 
    user-leave-a-room
  • 事件,因此仍在房间内的每个人都会立即收到通知。
    这里的美妙之处在于
  • 实时
  • 更新 - 您不必为其他人依赖 HTTP,只需快速 WebSocket 推送即可。
  • 第 4 步:
前端同步 HTTP 响应和 WebSocket 事件

在前端,您现在需要处理两件事:

等待
    HTTP 响应
  1. 以了解用户何时正式离开房间。 监听 WebSocket 事件
  2. user-leave-a-room
  3. 以更新所有其他参与者的 UI。
    
    
  4. socket.on('user-leave-a-room', ({ userId, roomName }) => { console.log(`${userId} left room ${roomName}`); // Update the chat UI accordingly, maybe show a notification });
HTTP 响应向“离开的用户”确认他们已离开房间,因此他们的 UI 可以立即反映这一点。
  • 同时,WebSocket 事件会实时更新剩余用户,确保每个人都知道谁还在那里。
  • 稍微回顾一下:

HTTP请求

:用户触发离开房间请求;控制器处理它,等待一切完成,然后响应。
  • WebSocket 网关:HTTP 逻辑完成后,WebSocket 网关通知其他所有人用户已离开。
  • 前端:UI 通过 WebSocket 事件获取实时更新,并通过 HTTP 响应确保离开的用户确切知道事情发生的时间。
© www.soinside.com 2019 - 2024. All rights reserved.