如何过滤NestJS DTO中的多余属性?技术咨询
回答
别担心,这个问题在NestJS里很容易解决,核心就是给ValidationPipe配置正确的选项,让它自动处理多余属性。
方式一:给单个接口的Pipe加配置
直接修改你@Body里的ValidationPipe,开启whitelist选项:
@Post('users') async addUser( @Response() res, @Body(new ValidationPipe({ whitelist: true, // 自动移除DTO里没定义的属性 // 要是想对多余属性直接报错,就打开下面这个选项 // forbidNonWhitelisted: true, })) createUserDTO: CreateUserDTO ) { await this.userService.addUser(createUserDTO).subscribe((users) => { res.status(HttpStatus.OK).json(users); }); }
方式二:全局配置(更推荐)
如果希望整个项目的所有接口都自动过滤多余属性,直接在main.ts里全局注册ValidationPipe:
import { NestFactory } from '@nestjs/core'; import { ValidationPipe } from '@nestjs/common'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); // 全局启用ValidationPipe并配置过滤规则 app.useGlobalPipes(new ValidationPipe({ whitelist: true, // forbidNonWhitelisted: true, // 可选,开启后多余属性会返回400错误 })); await app.listen(3000); } bootstrap();
补充说明
whitelist: true:会自动剔除所有DTO中未声明的字段,只保留你定义的那些属性。forbidNonWhitelisted: true:如果请求里有DTO没定义的字段,直接返回400错误,适合要求严格的业务场景。
另外要确保你已经装了依赖,因为ValidationPipe需要这两个包:
npm install class-validator class-transformer
这样配置后,再提交带多余属性的请求,那些_age、test之类的字段就不会出现在你的DTO实例里啦~
内容的提问来源于stack exchange,提问作者LuxProt
相关产品推荐
相关产品推荐

