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
相关产品推荐
相关产品推荐

