我不知道如何处理以下发射器:
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