如何将ConnectedSocket注入NestJS中的服务

时间:2020-03-11 07:43:25

标签: websocket nestjs

我想将@ConnectedSocket注入提供提供事件发射接口的nestjs服务中。目标非常明确-避免使用原始事件名称和any数据调用emit。下面的SocketFacadeHost是此类服务的示例。

到目前为止,我唯一想到的方法是用外墙服务工厂-SocketFacade包装套接字来替换每个emit调用。

socket.facade.ts

class SocketFacadeHost {
  constructor(private client: Socket) { }

  syncDSL(dsl: CoreDSL): void {
    this.client.emit('syncDSL', dsl);
  }
}

export const SocketFacade = (client: Socket) => new SocketFacadeHost(client);

socket.gateway.ts

  ...

  @SubscribeMessage('bind')
  async bindEnvironment(
    @MessageBody() data: BindingDTO,
    @ConnectedSocket() client: Socket,
  ): Promise<void> {
    const { pageUUID } = data;
    const page = await this.pagesService.getByUUID(pageUUID);
    SocketFacade(client).syncDSL(page.coreDSL);
  }

但这仍然有点荒谬。有什么简单的方法吗?

像扩展@ConnectedSocket装饰器或WebSocketGateway一样?

-编辑1 ---

在阅读了有关该主题的大量文档,示例和问题之后,我相信问题在于使服务意识到上下文的想法,默认情况下这是不正确的。因此,警卫,拦截器,管道和所有ExecutionContext装饰器仅在控制器/网关级别上起作用。服务应该是无状态的,或者应该在每次调用时都实例化(由@Injectable范围控制)。

所以我使用外观工厂的方法还可以。

但是再说一次,如果可以用一个装饰器“替换” @ConnectedSocket()装饰器,该装饰器返回带有接口的包装好的套接字,而不会与干净的mvc混淆,那将很方便。

1 个答案:

答案 0 :(得分:0)

最后,我解决了自己的“依赖注入”问题。由于请求范围不是WebSocketGateway的选项,因此我决定手动实例化和清理所需的服务,并将它们存储在具有附加存储接口的Socket客户端中。

通过这种方式,我可以建立ConnectedSocket范围的类,它们可以相互通信,同时仍然可以访问全局作用域注入(必须通过网关将其手动传递给所有类)。

给出方法可以解决所有问题,同时使所有内容保持干燥,并与某些天ConnectedSocket范围可以添加到NestJS的想法保持同步。

enter image description here