首页 > 解决方案 > 如何使用在 Nestjs 中具有注入服务的侦听器侦听事件?

问题描述

我有一个侦听器来侦听事件,但我也希望该侦听器调用其他服务来执行事件作为事件的一部分。即创建数据库通知,发送短信等。

当我创建一个构造函数来注入依赖的服务时,侦听器停止接收事件,当我使用服务删除构造函数时,它又开始工作了。

我需要如何构建它以使侦听器能够调用其他服务,例如下面示例中的 NotificationsService?

客户端更新的.listener.ts

    @Injectable()
    export class ClientUpdatedListener {

    constructor(
        @Inject(NotificationsService) private notificationService) {
    }

    private readonly logger = new Logger(ClientUpdatedListener.name);

    @OnEvent(eventType.CLIENT_UPDATED)
    handleClientUpdatedEvent(event: ClientUpdatedEvent) {
        this.logger.log('Processing event: ' + eventType.CLIENT_UPDATED );
        console.log(event);

       this.notificationService.emailClient(event.id);
    }

通知服务。目前它是一个外壳,但我希望在其中执行逻辑和可能的数据库调用。

@Injectable()
export class NotificationsService {

    constructor(
        @Inject(TENANT_CONNECTION) private tenantDb,
    ) {}
    
    emailClient(id: string) {
        console.log(id);
    } 
}

调用服务代码

    const clientUpdatedEvent = new ClientUpdatedEvent();
    clientUpdatedEvent.id = id;
    this.eventEmitter.emit(eventType.CLIENT_UPDATED, clientUpdatedEvent);

标签: node.jsnestjs

解决方案


您会在文档中注意到,有一个明确的警告,即不能限定事件侦听服务的REQUEST范围。如果您需要访问请求范围服务,则需要将请求信息作为事件负载的一部分传递,并使用ModuleRef 和 ContextIdFactory为当前子树生成上下文 id,然后NotificationsService从那个子树。


推荐阅读