我想将@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
一样?
在阅读了有关该主题的大量文档,示例和问题之后,我相信问题在于使服务意识到上下文的想法,默认情况下这是不正确的。因此,警卫,拦截器,管道和所有ExecutionContext装饰器仅在控制器/网关级别上起作用。服务应该是无状态的,或者应该在每次调用时都实例化(由@Injectable范围控制)。
所以我使用外观工厂的方法还可以。
但是再说一次,如果可以用一个装饰器“替换” @ConnectedSocket()装饰器,该装饰器返回带有接口的包装好的套接字,而不会与干净的mvc混淆,那将很方便。