Как глобально ввести значение через модули в NestJS? - PullRequest
1 голос
/ 29 марта 2019

Я работаю с nx workspace и nestjs.Я хотел бы ввести значение в несколько модулей в приложении nestjs.

Конечная цель - воспроизвести способ управления конфигурацией, аналогичный vsavkin, упомянутому для Angular

Но, похоже,это невозможно, или я что-то пропустил.

Nest не может разрешить зависимости FeatureService (?).Убедитесь, что аргумент по индексу [0] доступен в контексте FeatureModule.

Как я могу уведомить FeatureModule, что ему необходим доступ к этому глобальному введенному значению?

Это нормально работает внутри AppService (служба в корневом модуле), но не в каких-либо субмодулях.

Вот мой код ниже.Или полный пример на codesandbox.io

app.module.ts

@Module({
  imports: [
    FeatureModule
  ],
  controllers: [
    AppController
  ],
  providers: [
    AppService,
    {
      provide: 'MY-TOKEN',
      useValue: 'my-injected-value',
    }
  ],
})
export class AppModule {}

feature.module.ts

@Module({
  imports: [],
  controllers: [],
  providers: [
    FeatureService
  ],
})
export class FeatureModule {
}

feature.service.ts

@Injectable()
export class AppService {
  constructor(
    @Inject('MY-TOKEN') private injectedValue: string
  ) {}
}

1 Ответ

1 голос
/ 29 марта 2019

Цитата из NestJS Официальная документация :

В Angular поставщики зарегистрированы в глобальном масштабе. После определения они доступны везде. С другой стороны, Nest инкапсулирует поставщиков внутри области модуля. Вы не можете использовать поставщиков модулей в другом месте без их импорта. Но иногда вы можете просто захотеть предоставить набор вещей, которые должны быть всегда доступны - например, «из коробки»: помощники, соединение с базой данных, что угодно. Вот почему вы можете сделать модуль глобальным .

Итак, вы можете просто определить один глобальный модуль с этим MY-TOKEN провайдером:


@Global()
@Module({  
  providers: [
    {
      provide: 'MY-TOKEN',
      useValue: 'my-injected-value',
    }
  ],
  exports: ['MY-TOKEN'],
})
export class GlobalModule {}

и затем вы можете использовать его экспортированные значения, нигде не импортируя глобальный модуль.

...