You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:20:54