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

Nest.js中UnprocessableEntityException报错:message属性不存在

Nest.js ValidateInputPipe 报错解决:Property 'message' does not exist on type 'string'

跟着Nest.js教程写validate.pipe.ts时碰到类型错误,代码如下:

import { Injectable, ArgumentMetadata, BadRequestException, ValidationPipe, UnprocessableEntityException } from '@nestjs/common';

@Injectable()
export class ValidateInputPipe extends ValidationPipe {
   public async transform(value, metadata: ArgumentMetadata) {
      try {
        return await super.transform(value, metadata);
      } catch (e) {
         if (e instanceof BadRequestException) {
            throw new UnprocessableEntityException(this.handleError(e.message.message));
         }
      }
   }

   private handleError(errors) {
    return errors.map(error => error.constraints);
   }
}

报错信息翻译后:

类型“string”上不存在属性“message”。

throw new UnprocessableEntityException(this.handleError(e.message.message));

问题原因

Nest.js版本迭代后,BadRequestException的message属性结构发生了变化——旧版本中它是嵌套对象,新版本里直接是字符串,所以e.message.message这种写法会触发类型错误,因为字符串本身没有message属性。

修复方案

直接通过getResponse()方法获取完整错误响应,再提取错误信息,同时兼容不同格式的错误内容:

修改后的完整代码:

import { Injectable, ArgumentMetadata, BadRequestException, ValidationPipe, UnprocessableEntityException } from '@nestjs/common';

@Injectable()
export class ValidateInputPipe extends ValidationPipe {
   public async transform(value, metadata: ArgumentMetadata) {
      try {
        return await super.transform(value, metadata);
      } catch (e) {
         if (e instanceof BadRequestException) {
            // 获取完整错误响应内容
            const errorResponse = e.getResponse();
            // 兼容对象和字符串两种格式的错误信息
            const errors = typeof errorResponse === 'object' 
              ? (errorResponse as any).message 
              : [errorResponse];
            throw new UnprocessableEntityException(this.handleError(errors));
         }
         // 非验证类错误直接抛出
         throw e;
      }
   }

   private handleError(errors: any[]) {
    return errors.map(error => 
      // 兼容对象类型错误(含constraints)和字符串类型错误
      typeof error === 'object' ? error.constraints : error
    );
   }
}

这样既适配了新版本Nest.js的错误结构,也能正确提取验证错误信息并转换成UnprocessableEntityException返回。

内容的提问来源于stack exchange,提问作者Graham Morby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:39:59