处理EventEmitterModule通配符-NestJS



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

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中得到的似乎只是作业对象。

第页。S.我正确地将EventEmitterModule包含在我的导入中:

EventEmitterModule.forRoot({
wildcard: true
}),

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

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

为此,我们有一个emitter.event属性,用于标识当前激发的事件。所以NestJS发射器包装器也应该有它。以下是文档中的一个示例:

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

根据您的共享链接:http://%20docs.nestjs.com/technologies/events#listing-events,正确的语法看起来像:

@OnEvent('order.*'(

在您的情况下:

@OnEvent('job.*'(

另一种选择是使用包装器提供程序覆盖emit函数,或者创建一个增强版本的emitter,它将添加事件名称作为第一个/最后一个值,或者根据您的喜好修改第一个参数。

例如:

import { Global, Module, Provider } from '@nestjs/common';
import { EventEmitter2, EventEmitterModule as EventEmitterModule2 } from '@nestjs/event-emitter';
import { event, eventNS } from 'eventemitter2';
import * as _ from 'lodash';
export const EVENT_EMITTER = 'EventEmitter';
export interface EventEmitter extends EventEmitter2 {
emitWithName: (event: event | eventNS, ...values: any[]) => boolean; //copy of the signature of emit function
}
const eventEmitterFactory: Provider = {
provide: EVENT_EMITTER,
useFactory: (eventEmitter2: EventEmitter2) => {
const emitWithName = (event: event | eventNS, ...values: any[]): boolean => {
if (_.isObject(values[0])) {
values[0].event = event;
}
const valuesWithName = [...values, event];
const result = eventEmitter2.emit(event, ...valuesWithName);
return result;
};
Object.assign(eventEmitter2, { emitWithName });
return eventEmitter2;
},
inject: [EventEmitter2],
};
@Global() //because EventEmitterModule is a global dynamic module
@Module({
imports: [
EventEmitterModule2.forRoot({
wildcard: true,
}),
],
providers: [eventEmitterFactory],
exports: [eventEmitterFactory],
})
export class EventEmitterModule {}

在app.module中,您需要导入此模块,并注入提供程序:

@Inject(EVENT_EMITTER) private readonly eventEmitter: EventEmitter

我试着做一些非常相似的事情,但有模式,显然现在不可能。所以我想说,对每一个使用不同的装饰器行。

@OnEvent('job.create')
...
...
...
@OnEvent('job.update')

注意打开的线程也很好:https://github.com/nestjs/nest/issues/3083

最新更新