node.js - 如何使用在 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);
解决方案
您会在文档中注意到,有一个明确的警告,即不能限定事件侦听服务的REQUEST
范围。如果您需要访问请求范围服务,则需要将请求信息作为事件负载的一部分传递,并使用ModuleRef 和 ContextIdFactory为当前子树生成上下文 id,然后NotificationsService
从那个子树。
推荐阅读
- flutter - Flutter - 将来自不同文本字段的值相乘
- java - 通过launch4j生成的可执行文件不启动
- javascript - 删除json中的最后一个元素
- angular - ngx-admin 侧边栏菜单分组/集群选项
- python - checkpoint_path 和 argparse 错误发生
- python - 根据第一个匹配合并两个 DF
- python - 通过从给定元组中删除元素来获取所有元组的快速、pythonic 方法?
- javascript - HTML 在索引 JS 处仅显示一个对象,尽管还有更多
- gitlab - 如何在 gitlab 中访问从上次运行到当前运行相同作业的工件 ..?
- java - AppCompatDelegate.setDefaultNightMode 在物理设备上不起作用