【问题标题】:Handle EventEmitterModule wildcards - NestJS处理 EventEmitterModule 通配符 - NestJS
【发布时间】:2023-04-10 17:32:01
【问题描述】:

我不知道如何处理以下发射器:

async create(createJobDto: CreateJobDto)  {
    this.eventEmitter.emit(
        ['job','create'],
        createJobDto,
    );
}

async update(createJobDto: CreateJobDto)  {
    this.eventEmitter.emit(
        ['job','update'],
        createJobDto,
    );
}

听众:

@OnEvent('job.**')
handleJobEvent(data: CreateJobDto) {
    console.log(data);
});

NestJS 和 EventEmitter2 文档提到我可以使用数组作为通配符,但是如何区分侦听器中的“创建”和“更新”?我似乎在data 中得到的只是工作对象。

附:我正确地将 EventEmitterModule 包含在我的导入中:

EventEmitterModule.forRoot({
  wildcard: true
}),

【问题讨论】:

  • 你试过@OnEvent('job.*)只有一个*吗?

标签: javascript typescript nestjs


【解决方案1】:

我认为这是不可能的。您必须创建两个不同的侦听器:

@OnEvent('job.create')
handleJobCreateEvent(data: CreateJobDto) {
    console.log(data);
});

@OnEvent('job.update')
handleJobUpdateEvent(data: CreateJobDto) {
    console.log(data);
});

【讨论】:

【解决方案2】:

为此,我们有一个emitter.event 属性来标识当前触发的事件。所以 NestJS 发射器包装器也应该有它。这是来自docs 的示例:

emitter.on('foo.*', function(value1, value2) {
  console.log(this.event, value1, value2);
});

emitter.emit('foo.bar', 1, 2); // 'foo.bar' 1 2
emitter.emit(['foo', 'bar'], 3, 4); // 'foo.bar' 3 4

emitter.emit(Symbol(), 5, 6); // Symbol() 5 6
emitter.emit(['foo', Symbol()], 7, 8); // ['foo', Symbol()] 7 8

【讨论】:

  • 谢谢 - 我知道这是如何通过发射器来完成的,但是 NestJS 包装器中的侦听器似乎与 eventemitter2 侦听器的处理方式不同。我认为@Terenoth 最终是正确的。
  • 嗯。像this.eventEmitter 这样的方法内部没有对发射器的引用吗?如果事件发射器是 EventEmitter2 实例,这应该可以工作this.eventEmitter.event
【解决方案3】:

根据您的共享链接:http://%20docs.nestjs.com/techniques/events#listening-to-events,正确的语法如下所示:

@OnEvent('order.*')

在你的情况下:

@OnEvent('job.*')

【讨论】:

    猜你喜欢
    • 2020-09-03
    • 2018-09-27
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多