找不到命令处理程序的CommandHandler异常

时间:2019-04-07 08:29:41

标签: javascript node.js typescript nestjs class-transformer

我尝试使用命令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 个答案:

答案 0 :(得分:0)

如果您使用@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);
}