Nestjs使用nestjs-i18n时自定义异常过滤器国际化失效问题
问题原因及解决方案
你遇到的翻译直接返回key的问题,由以下几个常见配置错误导致,按顺序排查即可解决:
1. 翻译文件未被正确打包到运行目录
Nest默认编译时只会把.ts文件打包到dist目录,你存放在src下的i18n json文件不会被自动复制,导致运行时找不到翻译资源,直接返回key。
解决方法:
修改nest-cli.json配置,添加assets规则让i18n文件在编译时自动复制到dist:
{ "collection": "@nestjs/schematics", "sourceRoot": "src", "compilerOptions": { "assets": ["i18n/**/*"], "watchAssets": true // 开发模式下修改翻译文件自动同步 } }
2. 翻译文件结构或命名不匹配
你调用的key是message.Unauthorized,需要严格匹配翻译文件的目录、文件名和内部key结构。
要求的目录结构:
src/ ├── i18n/ │ ├── en/ │ │ └── message.json │ └── fr/ │ └── message.json
fr/message.json 内容示例:
{ "Unauthorized": "Vous n'êtes pas autorisé à accéder à cette ressource" }
3. 异常过滤器依赖注入配置错误
你注册全局异常过滤器时直接使用useClass,但过滤器依赖I18nService,这种注册方式不会触发Nest的依赖注入,导致I18nService实例异常,无法正常加载翻译。
解决方法:
修改app.module.ts中全局过滤器的注册逻辑,用useFactory手动注入依赖:
providers: [ AppService, { provide: APP_FILTER, useClass: NotFoundExceptionFilter, }, { provide: APP_FILTER, useFactory: (i18n: I18nService) => new HttpExceptionFilter(i18n), inject: [I18nService] } ]
可选优化:动态获取请求语言
你当前写死了lang: 'fr',如果需要根据请求参数、请求头自动适配语言,可以直接用I18nContext获取当前请求的上下文翻译实例:
import { I18nContext } from 'nestjs-i18n'; @Catch(HttpException) export class HttpExceptionFilter implements ExceptionFilter<HttpException> { async catch(exception: HttpException, host: ArgumentsHost) { const ctx = host.switchToHttp(); const response = ctx.getResponse(); const i18n = I18nContext.current(host); const message = await i18n.t('message.Unauthorized'); response.status(403).send({ status: 6, message: message, data: null }); } }
内容的提问来源于stack exchange,提问作者Abhishek Chaniyara
相关产品推荐
相关产品推荐

