【问题标题】:Nestjs CQRS - CommandHandlerNotFoundExceptionNestjs CQRS - CommandHandlerNotFoundException
【发布时间】:2020-06-16 23:25:35
【问题描述】:

我正在尝试在我的 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 this.commandBus.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,尽管我相信它已被宣布...我做错了什么?

提前致谢。

【问题讨论】:

    标签: node.js cqrs nestjs


    【解决方案1】:

    由于您想在另一个模块中使用处理程序(例如 appModule ),您需要将 @Injectable() 装饰器添加到 StartWorkflowHandler 类。

    并在 main.ts 中调用 app.init()。在启动应用程序之前。

    【讨论】:

      【解决方案2】:

      您的 MessageBusModule 不会重新导出处理程序,因此它们在 app.module 级别上不“可见”(至少这是我自己理解的)

      我遇到了类似的情况:

      const commands = [NewOrder, ChargeForOrder]
      const events = [ChargeOrder, OrderProcessed]
      const sagas = [AdjustWalletFunds]
      
      @Module({
        imports: [
          CqrsModule,
          WalletsModule,
          TypeOrmModule.forFeature([...]),
        ],
        providers: [...commands, ...events, ...sagas],
        exports: [CqrsModule, ...commands, ...events, ...sagas],
      })
      export class RxModule {}
      
      

      所以,假设您在主 app.module 中导入您的 MessageBusModule,请尝试以下操作:

      @Module({
          imports: [CqrsModule],
          providers: [
              MessageBusLocalService,
              StartWorkflowHandler
          ],
          exports: [MessageBusLocalService, StartWorkflowHandler]
      })
      export class MessageBusModule {
      }
      

      【讨论】:

      • 谢谢,但不幸的是这没有帮助。
      【解决方案3】:

      事实证明,我在问题中使用的方法不起作用。

      但是,如果我在控制器中注入 MessageBusLocalService,它会按预期工作。

      回答我自己的问题似乎很奇怪,但它最终可能会对某人有所帮助。

      【讨论】:

      • 命令、事件、查询在 Init Module 事件上注册,因此可能在您调用解析命令处理程序时,处理程序尚未准备好
      【解决方案4】:

      确保您导入了 CqrsModule。还将MessageBusModule 导入到任何其他调用它的模块中。

      【讨论】:

        猜你喜欢
        • 2021-03-27
        • 1970-01-01
        • 1970-01-01
        • 2022-12-10
        • 2020-04-29
        • 2019-05-23
        • 2020-06-11
        • 2022-01-09
        • 2019-08-21
        相关资源
        最近更新 更多