如何使用 nestjs 和 socket.io 创建房间

Posted

技术标签:

【中文标题】如何使用 nestjs 和 socket.io 创建房间【英文标题】:How to create rooms with nestjs and socket.io 【发布时间】:2019-09-20 19:22:48 【问题描述】:

我正在尝试在我的 nestjs 后端创建一个房间,但找不到有关此主题的任何信息。你可以找到文档here。文档似乎没有关于这个主题的任何内容。

import 
  SubscribeMessage,
  WebSocketGateway,
  WebSocketServer,
  WsResponse,
 from '@nestjs/websockets';
import  Client, Server  from 'socket.io';

@WebSocketGateway(namespace: 'story')
export class StoryEventsGateway 
  @WebSocketServer()
  server: Server;

  @SubscribeMessage('createRoom')
  createRoom(client: Client, data: string): WsResponse<unknown> 
    return  event: 'roomCreated', data ;
  


【问题讨论】:

【参考方案1】:

通过将client: Client 更改为socket: Socket,您可以使用在使用socket.io 时习惯使用的套接字对象。

这是编辑后的函数。

import  Socket  from 'socket.io';
import  WsResponse  from '@nestjs/websockets';

createRoom(socket: Socket, data: string): WsResponse<unknown> 
  socket.join('aRoom');
  socket.to('aRoom').emit('roomCreated', room: 'aRoom');
  return  event: 'roomCreated', room: 'aRoom' ;

【讨论】:

这确实应该在文档中,突出显示。非常感谢您提供的信息。 我同意它很容易被忽略,但如果您在页面docs.nestjs.com/websockets/gateways 上搜索handleEvent(client: Socket, data: string):,他们很快就会提到访问套接字实例。【参考方案2】:

通过最新的 Nest JS 更新,您可以使用此代码从前端发送房间名称并将其传递给“数据”变量:

@SubscribeMessage('createRoom')
  createRoom(@MessageBody() data: string, @ConnectedSocket() client: Socket) 
    client.join(data, err => 
      if (err) 
        this.logger.error(err);
      
    );
  

【讨论】:

以上是关于如何使用 nestjs 和 socket.io 创建房间的主要内容,如果未能解决你的问题,请参考以下文章

NestJS + Socket.io:没有收到消息

在 NestJS 中连接后,Socket.io 客户端正在断开连接

NESTJS 网关/Websocket - 如何通过 socket.emit 发送 jwt access_token

如何将 socket.io 与 graphql 订阅一起使用?

NestJs Socket io 适配器:如果使用 false 调用 allowFunction,服务器不会将 CORS 标头添加到握手的响应中。错误或配置错误?

来自 php 源的 Socket.io