Nestjs CQRS
我正在尝试在我的nestjs应用中使用事件。
但是,当我尝试触发命令时,却显示CommandHandlerNotFoundException
。
我有message-bus.module
:
@Module({
imports: [CqrsModule],
providers: [
MessageBusLocalService,
StartWorkflowHandler
],
exports: [MessageBusLocalService]
})
export class MessageBusModule {
}
message-bus-local.service
@Injectable()
export class MessageBusLocalService {
constructor(private readonly commandBus: CommandBus, private eb: EventBus) {
}
startWorkflow(workflowId: string, payload: any) {
return thismandBus.execute(
new StartWorkflowCommand(workflowId, payload)
);
}
}
和start-workflow.handler
@CommandHandler(StartWorkflowCommand)
export class StartWorkflowHandler implements ICommandHandler<StartWorkflowCommand> {
constructor() {}
async execute(command: StartWorkflowCommand) {
console.log('Workflow started', command.jobId);
return true;
}
}
我正在尝试引导应用程序时触发命令:
const app = await NestFactory.create(ApplicationModule);
const service = app.get(MessageBusLocalService);
try {
const c = await service.startWorkflow('abcde', {just: "test"});
console.log('And returned', c);
} catch (e) {
console.error(e)
}
并且...尽管我相信已声明CommandHandlerNotFoundException
,但我到了那里。我做错了什么?
提前感谢。
回答如下:您的MessageBusModule
不会重新导出处理程序,因此它们在app.module级别上不是“可见的”(至少这是我自己理解的)]
我有类似的情况:
const commands = [NewOrder, ChargeForOrder]
const events = [ChargeOrder, OrderProcessed]
const sagas = [AdjustWalletFunds]
@Module({
imports: [
CqrsModule,
WalletsModule,
TypeOrmModule.forFeature([...]),
],
providers: [..mands, ...events, ...sagas],
exports: [CqrsModule, ..mands, ...events, ...sagas],
})
export class RxModule {}
因此,假设您将MessageBusModule
导入主app.module中,请尝试以下操作:
@Module({
imports: [CqrsModule],
providers: [
MessageBusLocalService,
StartWorkflowHandler
],
exports: [MessageBusLocalService, StartWorkflowHandler]
})
export class MessageBusModule {
}