Nestjs 和 nestjs-i18n:国际化在自定义异常过滤器中不起作用
Nestjs and nestjs-i18n: Internationalization not working in Custom Exception Filter
我正在尝试在我的 NestJS 应用程序中使用异常过滤器。我必须根据请求值将我的异常消息翻译成另一种语言。我有两个语言文件 en 和 fr.
我已经在 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 { }
我的异常过滤器 class 如下所示:
@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
应该return fr 语言的消息。
谁能帮帮我,我哪里错了?
忘记在nest-cli.json添加路径了。如果我们将路径放在该文件中,那么上面的代码就可以正常工作。
{
"collection": "@nestjs/schematics",
"sourceRoot": "src",
"compilerOptions": {
"assets": ["i18n/**/*","ssl/**/*"]
}
}
我正在尝试在我的 NestJS 应用程序中使用异常过滤器。我必须根据请求值将我的异常消息翻译成另一种语言。我有两个语言文件 en 和 fr.
我已经在 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 { }
我的异常过滤器 class 如下所示:
@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
应该return fr 语言的消息。
谁能帮帮我,我哪里错了?
忘记在nest-cli.json添加路径了。如果我们将路径放在该文件中,那么上面的代码就可以正常工作。
{
"collection": "@nestjs/schematics",
"sourceRoot": "src",
"compilerOptions": {
"assets": ["i18n/**/*","ssl/**/*"]
}
}