CommandHandler не нашел исключение с полезной нагрузкой команды

#javascript #node.js #typescript #nestjs #class-transformer

#javascript #node.js #typescript #nestjs #класс-трансформер

Вопрос:

Я пытаюсь использовать команду DTO, но его обработчик не распознается. Когда я регистрирую DTO, это простой объект {...} без CreateUserCommand подписи.

Вот мой контроллер :

 async index(@Body() createUserCommand: CreateUserCommand): Promise<User> {
    console.log(createUserCommand);
    return await this.commandBus.execute(createUserCommand);
  }
  

Я получаю следующий вывод :

  { 
    firstName: 'xxx',
    lastName: 'xxx',
    email: 'xxx@xxx.com',
    password: 'xxx'
}
  

Когда я пытаюсь использовать непосредственно команду, она работает :

 const command = new CreateUserCommand();
command.firstName = 'xxx';
command.lastName = 'xxx';
command.email = 'xxx@xxx.com';
command.password = 'xxx';

return await this.commandBus.execute(createUserCommand);
  

Следующий вывод :

  CreateUserCommand { 
    firstName: 'xxx',
    lastName: 'xxx',
    email: 'xxx@xxx.com',
    password: 'xxx'
}
  

Возможно ли использовать DTO в качестве обработчика команд?

Ответ №1:

Если вы используете @Body , это приведет к созданию простого объекта javascript, но не экземпляра вашего класса dto. Вы можете использовать class-transformer и его plainToClass(CreateUserCommand, createUserCommand) метод для фактического создания экземпляра вашего класса.

Если вы используете ValidationPipe , он может автоматически преобразовать ваш обычный объект в класс, если вы передадите параметр transform: true :

 @UsePipes(new ValidationPipe({ transform: true }))
async index(@Body() createUserCommand: CreateUserCommand): Promise<User> {
    console.log(createUserCommand);
    return await this.commandBus.execute(createUserCommand);
}