为什么 NestJS 中 forRootAsync 设置的 resolvers 不生效?

新手上路,请多包涵
import { DynamicModule } from '@nestjs/common';
import { join } from 'path';
import { I18nModule as i18n, HeaderResolver } from 'nestjs-i18n';
import { ConfigService } from '@nestjs/config';

export class I18nModule {
static forRootAsync(): DynamicModule {
const rootPath = join(__dirname, '..', '..', '..');
return i18n.forRootAsync({
inject: [ConfigService],
resolvers: [new HeaderResolver(['lang'])], // 请求头匹配
useFactory: (configService: ConfigService) => ({
fallbackLanguage: configService.get('i18n.fallbackLanguage'), // 默认语言
loaderOptions: {
path: ${rootPath}${configService.get<string>('i18n.path')}, // 翻译文件位置
watch: configService.get('i18n.watch'), // 将选项设置watch为可true启用loaderOptions实时重新加载
},
}),
});
}
}

使用nestjs-i18n翻译,想通过接口请求header中的lang对应翻译,但是发现翻译的语言一直都是fallbackLanguage的语言。

阅读 810
1 个回答

在 NestJS 中使用 forRootAsync 设置 resolvers 不生效的原因通常是因为 resolvers 的位置不正确。resolvers 应该放在 useFactory 外面,而不是里面。

import { DynamicModule } from '@nestjs/common';
import { join } from 'path';
import { I18nModule as i18n, HeaderResolver } from 'nestjs-i18n';
import { ConfigService } from '@nestjs/config';

export class I18nModule {
  static forRootAsync(): DynamicModule {
    const rootPath = join(__dirname, '..', '..', '..');
    return i18n.forRootAsync({
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => ({
        fallbackLanguage: configService.get('i18n.fallbackLanguage'),
        loaderOptions: {
          path: `${rootPath}${configService.get<string>('i18n.path')}`,
          watch: configService.get('i18n.watch'),
        },
      }),
      resolvers: [new HeaderResolver(['lang'])], // 将 resolvers 放在 useFactory 外面
    });
  }
}
宣传栏