创建新用户将忽略create-user.dto.ts
中的非指定对象
但是,当我更新用户时,它会添加不需要的字段,如下所示:
// update-user.dto.ts
import { IsEmail } from 'class-validator';
import { Address } from '../model/address';
export class UpdateUserDto {
firstName: string;
lastName: string;
@IsEmail(undefined, { message: 'Not a valid e-mail' })
email: string;
username: string;
password: string;
addresses: Address[];
}
这是来自用户服务的更新操作
// user.service.ts
async update(data: UpdateUserDto) {
try {
this.logger.log(data);
const id = '5c6dd9852d4f441638c2df86';
const user = await this.userRepository.update(id, data);
return { message: 'Updated your information' };
} catch (error) {
this.logger.log(error);
throw new HttpException('', HttpStatus.INTERNAL_SERVER_ERROR);
}
}
这里是用户.Controler.ts
@Patch()
@UsePipes(CustomValidationPipe)
async update(@Body() data: UpdateUserDto) {
return this.userService.update(data);
}
客户端补丁数据:
// Unwanted junk from client
{
"email": "newemail@gmail.com",
"junk": "junk"
}
email
将正确更新,但该行将具有值为junk
的新的不需要的属性junk
5条答案
按热度按时间wpcxdonn1#
我假设您在
CustomValidationPipe
中使用的是class-transformer
的validate
方法。当您将
whitelist
选项传递给它时,validate
将去除所有未知(->DTO类中没有注解)属性:如果您希望抛出验证错误,而不是仅仅删除未知属性,则可以另外传递
forbidNonWhitelisted
选项。在更新的情况下,您可能还希望使用
skipMissingProperties: true
,这样,当lastName
不是更新的一部分时,验证将不会抛出错误。请注意,您应该注解dto类中的所有属性,以使验证正常工作:
yftpprvb2#
不确定此行为/选项何时添加到NestJS中(可能是在原始问题和接受的答案之后添加的),但实现未知属性剥离的最佳方法是:
就是这样。只要确保您的配置中有
whitelist: true
,您就不会得到任何未知/无效的属性。还可以通过将另一个名为
forbidNonWhitelisted
的属性设置为true
来完全停止请求。更多信息请点击此处:https://docs.nestjs.com/techniques/validation#stripping-properties
dtcbnfnu3#
对于像我这样仍在疑惑的新手,这里有一些实现它的简单方法:
将修饰器放在方法修饰器下(@Post、@Put等)
UsePipe
和ValidationPipe
都是导入的@nestjs/common
tzdcorbm4#
如果您还想为意外属性抛出错误,可以按如下方式进行配置:
意外的属性将导致
有关讨论可在此处找到
bqujaahr5#
我找到了解决方案:
以下是user.service.ts update()应该是什么样子:
在此之前需要添加
以下是完整的user.service.ts更新()
现在,任何不需要的属性都不会添加到行中