如何在NestJS TCP微服务中实现DTO验证并解决报错?
NestJS TCP微服务DTO验证实现与报错解决
现有代码与报错
DTO文件 checkRemitter.dto.ts
import { IsNotEmpty, IsString } from 'class-validator'; export class checkRemitterDto { @IsNotEmpty() @IsString() readonly remitterNo: string; @IsNotEmpty() @IsString() userId: string }
控制器文件 app.controller.ts
import {checkRemitterDto} from "./dto" // ... @MessagePattern({ cmd: "checkRemitter" }) async checkRemitterData(data: checkRemitterDto) { try{ //some code }catch(error){ console.log(error) return new HttpException(error.response.data, error.response.status); } } // ...
报错信息
BadRequestException: Bad Request Exception at ValidationPipe.exceptionFactory (/home/saranjith/Desktop/ECAPS/yesbank-dmtsor-service/node_modules/@nestjs/common/pipes/validation.pipe.js:90:20) at ValidationPipe.transform (/home/saranjith/Desktop/ECAPS/yesbank-dmtsor-service/node_modules/@nestjs/common/pipes/validation.pipe.js:66:30) at processTicksAndRejections (node:internal/process/task_queues:95:5) at resolveParamValue (/home/saranjith/Desktop/ECAPS/yesbank-dmtsor-service/node_modules/@nestjs/microservices/context/rpc-context-creator.js:106:31) at async Promise.all (index 0) at pipesFn (/home/saranjith/Desktop/ECAPS/yesbank-dmtsor-service/node_modules/@nestjs/microservices/context/rpc-context-creator.js:108:13) at /home/saranjith/Desktop/ECAPS/yesbank-dmtsor-service/node_modules/@nestjs/microservices/context/rpc-context-creator.js:43:17 at /home/saranjith/Desktop/ECAPS/yesbank-dmtsor-service/node_modules/@nestjs/microservices/context/rpc-proxy.js:11:32 at ServerTCP.handleMessage (/home/saranjith/Desktop/ECAPS/yesbank-dmtsor-service/node_modules/@nestjs/microservices/server/server-tcp.js:62:54)
解决步骤
1. 全局配置ValidationPipe
NestJS微服务不会自动启用验证管道,需在main.ts中手动配置:
import { NestFactory } from '@nestjs/core'; import { ValidationPipe } from '@nestjs/common'; import { MicroserviceOptions, Transport } from '@nestjs/microservices'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, { transport: Transport.TCP, options: { host: 'localhost', port: 3001, }, }); // 启用全局验证管道 app.useGlobalPipes(new ValidationPipe({ whitelist: true, // 自动移除DTO未定义的属性 forbidNonWhitelisted: true, // 存在未定义属性时抛出错误 transform: true, // 自动将请求数据转为DTO类实例 })); await app.listen(); } bootstrap();
2. 为控制器参数添加@Body()装饰器
TCP微服务中必须用@Body()标记要验证的参数,否则管道无法识别验证目标:
import { Body } from '@nestjs/common'; import { MessagePattern } from '@nestjs/microservices'; import { checkRemitterDto } from "./dto"; // ... @MessagePattern({ cmd: "checkRemitter" }) async checkRemitterData(@Body() data: checkRemitterDto) { try{ //some code }catch(error){ console.log(error) return new HttpException(error.response.data, error.response.status); } } // ...
3. 确保依赖安装完整
确认class-validator和class-transformer已安装:
npm install class-validator class-transformer
4. 自定义异常返回(可选)
若需要更详细的错误信息,可自定义异常工厂:
app.useGlobalPipes(new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true, exceptionFactory: (errors) => { const formattedErrors = errors.map(error => ({ field: error.property, messages: Object.values(error.constraints), })); return new BadRequestException({ message: '参数验证失败', errors: formattedErrors, }); }, }));
内容的提问来源于stack exchange,提问作者RJ amal
相关产品推荐
相关产品推荐

