如何在class-validator中校验含未定义属性的请求Payload?
用class-validator实现NestJS请求Payload额外属性校验
要实现请求Payload包含DTO未定义属性时的校验,无需逐个使用@Exclude注解,只需通过NestJS ValidationPipe的内置配置配合class-validator即可实现,步骤如下:
核心配置逻辑
利用ValidationPipe的两个关键选项:
whitelist: true:自动过滤掉DTO类中未定义的属性forbidNonWhitelisted: true:若检测到请求体存在DTO未定义的属性,直接抛出验证异常
这两个选项结合,既能像Joi一样拦截非法属性,又无需手动标记每个要排除的字段。
全局配置(推荐)
在main.ts中全局启用配置,所有接口都会生效:
import { NestFactory } from '@nestjs/core'; import { ValidationPipe } from '@nestjs/common'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true, // 自动将请求体转为DTO实例,可选但推荐 })); await app.listen(3000); } bootstrap();
局部配置(按需使用)
如果不想全局生效,可在控制器或单个接口方法上单独配置:
import { Controller, Post, Body, UsePipes, ValidationPipe } from '@nestjs/common'; import { CreateMovieDto } from './dto/create-movie.dto'; @Controller('movies') export class MoviesController { @Post() @UsePipes(new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true, })) create(@Body() createMovieDto: CreateMovieDto) { // 业务逻辑处理 return createMovieDto; } }
DTO示例
正常定义DTO即可,无需额外排除注解:
import { IsString, IsNumber } from 'class-validator'; export class CreateMovieDto { @IsString() title: string; @IsNumber() year: number; }
效果验证
当请求体包含DTO未定义的属性(如director)时,接口会返回400状态码,错误信息类似:
property director should not exist
内容的提问来源于stack exchange,提问作者Mithun Jack
相关产品推荐
相关产品推荐

