【问题标题】:Nestjs and nestjs-i18n: Internationalization not working in Custom Exception FilterNestjs 和 nestjs-i18n:国际化在自定义异常过滤器中不起作用
【发布时间】:2021-10-27 10:04:03
【问题描述】:

我正在尝试在我的 NestJS 应用程序中使用异常过滤器。我必须根据请求值将我的异常消息翻译成另一种语言。我有两种语言文件 enfr

我已经在我的 app.module.ts 中初始化了 i18N,如下所示:

@Module({
  imports: [
   I18nModule.forRoot({
      fallbackLanguage: 'en',
      parser: I18nJsonParser,
      parserOptions: {
        path: path.join(__dirname, '/i18n/'),
      },
      resolvers: [
        PathResolver,
        { use: QueryResolver, options: ['lang', 'locale', 'l'] },
        AcceptLanguageResolver
      ]
    }),
  ],
  controllers: [AppController],
  providers: [AppService,
    {
      provide: APP_FILTER,
      useClass: NotFoundExceptionFilter,
    },
    {
      provide: APP_FILTER,
      useClass: HttpExceptionFilter,
      
    }
  ],
})
export class AppModule { }

我的异常过滤器类如下所示:

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter<HttpException> {

  constructor(private readonly i18n: I18nService) { }

  async catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    const request = ctx.getRequest();
    const statusCode = exception.getStatus();


    await this.i18n.translate('message.Unauthorized', { lang: 'fr' }).then(message => {
        console.log('message -> ', message);
        response.status(403).send({
                status: 6,
                message: message,
                data: null
              });  
      })
        

  }
}

我从 LocalAuthGuard 文件中抛出一个异常:

@Injectable()
export class LocalAuthGuard implements CanActivate {
        canActivate(context: ExecutionContext,): boolean | Promise<boolean> | Observable<boolean> {
                const request = context.switchToHttp().getRequest().body;
                if(isEmpty(request.authkey)){
                        return false;
                }else{
                        return true;
                }
        }        
}

我刚刚将我的项目示例代码放在这里。当我通过某个特定的 URL 运行这个项目时,我没有收到特定语言的消息。我在控制台日志中得到以下输出。

message -> message.Unauthorized

它应该以 fr 语言返回消息。

谁能帮帮我,我哪里出错了?

【问题讨论】:

  • 如果我不得不猜测一下,您的i18n 目录在编译时不会移动到dist,因此路径选项的__dirname + '/i18n/' 没有按预期工作。能不能展示一下srcdist的目录结构?

标签: node.js nestjs nestjs-i18n


【解决方案1】:

我忘记在 nest-cli.json 中添加路径。如果我们将路径放在该文件中,那么上面的代码就可以正常工作了。

{
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "assets": ["i18n/**/*","ssl/**/*"]
  }
}

【讨论】:

  • dist目录下存在i18n目录。但问题在于运行模块的顺序。 PolicyGuard 阻止运行解析器检测请求的语言。
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多