#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);
}