NestJS中nestjs-i18n在自定义装饰器中失效问题排查
问题分析与解决方案
问题根源
自定义参数装饰器CustomHeaders返回的是原始请求头对象,全局配置的I18nValidationPipe不会自动对其进行处理,导致RequestHeaderDto中的验证消息无法被正确解析为国际化文本,最终返回未替换的占位符格式lang.HELLO|{}。
解决方案
1. 显式为自定义参数应用国际化验证管道
在控制器的自定义参数上添加@UsePipes装饰器,强制I18nValidationPipe处理该参数的验证与国际化消息解析:
@Get('test') @UseFilters(new I18nValidationExceptionFilter()) async test( @I18n() i18n: any, @CustomHeaders() @UsePipes(new I18nValidationPipe()) headers: RequestHeaderDto, ): Promise<any> { const message = await i18n.t('lang.PRODUCT.NEW',{args: { name: 'Toon' }}) return message; }
2. 修复DTO类型转换问题(辅助优化)
请求头中的参数默认都是字符串类型,直接绑定到number类型的t_id会导致类型验证失败,需添加类型转换逻辑确保验证流程正常执行:
import { IsNotEmpty, IsNumber } from 'class-validator' import { i18nValidationMessage } from 'nestjs-i18n' import { Transform } from 'class-transformer' export class RequestHeaderDto { @Transform(({ value }) => parseInt(value, 10)) @IsNumber() @IsNotEmpty({ message: i18nValidationMessage('lang.HELLO'), }) t_id: number }
关键说明
- 全局管道仅默认处理
body、query、param这些标准请求参数,自定义参数装饰器返回的对象需要显式指定管道才能触发国际化消息解析。 - 类型转换是验证流程的前置条件,若类型不匹配会直接导致验证失败,后续的国际化消息逻辑无法正常触发。
内容的提问来源于stack exchange,提问作者Shubham Verma
相关产品推荐
相关产品推荐

