Nestjs CQRS - CommandHandlerNotFoundException - PullRequest
       13

Nestjs CQRS - CommandHandlerNotFoundException

0 голосов
/ 02 октября 2019

Я пытаюсь использовать события в моем приложении 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 там, хотя я считаю, что оно объявлено ... Что я сделал не так?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Как оказалось, метод, который я использовал в вопросе, не работает.

Однако он работает, как и ожидалось, если я ввожу MessageBusLocalService в контроллер.

Кажется страннымответить на мой собственный вопрос, но в конечном итоге это может кому-то помочь.

0 голосов
/ 03 октября 2019

Ваш 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 {}

поэтому, если вы импортируете свой MessageBusModule в основной файл app.module, попробуйте следующее:

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