如何在NestJs中处理POST请求缺失body属性 避免返回无信息500错误
NestJS POST请求Body属性缺失校验方案
NestJS原生支持请求Body的属性存在性、合法性校验,可以在请求进入业务逻辑前拦截非法请求,返回明确的400级错误提示,完全替代无意义的500错误。
1. 安装依赖
NestJS的校验能力基于 class-validator 和 class-transformer 两个包,先执行安装:
npm install class-validator class-transformer # 或者yarn安装 yarn add class-validator class-transformer
2. 全局启用校验管道
在项目入口文件 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); // 全局注册校验管道 app.useGlobalPipes(new ValidationPipe({ // 自动将请求Body转换为DTO类实例 transform: true, // 自动剔除DTO中未定义的额外属性 whitelist: true, // 自定义错误返回格式,输出明确的缺失属性提示 exceptionFactory: (errors) => { const messages = errors.map(error => { const constraints = Object.values(error.constraints); // 针对必填字段缺失的场景返回指定提示 if (constraints.some(c => c.includes('must be provided') || c.includes('should not be empty'))) { return `缺少${error.property}属性`; } return constraints.join(';'); }); return { statusCode: 400, message: messages, error: 'Bad Request' }; } })); await app.listen(3000); } bootstrap();
- 如果你不需要全局生效校验,也可以单独在对应控制器的路由方法上添加
@UsePipes(ValidationPipe)装饰器,仅对单个接口生效。
3. 给DTO添加校验装饰器
修改你定义的 SourceDto,给每个属性加上对应的校验规则,必填字段用 @IsNotEmpty() 标记:
import { IsNotEmpty, IsString, IsNumber, IsDate } from 'class-validator'; export class SourceDto { @IsNotEmpty() @IsString() id: string; @IsNotEmpty({ message: '缺少name属性' }) // 也可以单独指定字段的错误提示 @IsString() name: string; @IsNotEmpty() @IsString() description: string; @IsNotEmpty() @IsString() address: string; @IsNotEmpty() @IsString() agent_id: string; @IsNotEmpty() @IsNumber() state: number; @IsNotEmpty() @IsDate() created_at: Date; @IsNotEmpty() @IsDate() updated_at: Date; }
效果说明
配置完成后,当POST请求的Body缺失name等必填属性时,请求会在校验层直接被拦截,返回状态码400的响应,内容如下:
{ "statusCode": 400, "message": ["缺少name属性"], "error": "Bad Request" }
不会再进入业务逻辑层触发数据库层面的非空报错,也就不会返回无意义的500错误。你可以根据自身需求调整exceptionFactory的返回逻辑,自定义错误格式。
内容的提问来源于stack exchange,提问作者Mickael Zana
相关产品推荐
相关产品推荐

