Можно ли инициализировать защиту с указанным значением? Например, текущий пример не будет работать:
@Module({
imports: [
CoreModule,
],
providers: [
{
provide: AuthGuard, // while using APP_GUARD works
useFactory: (configService: ConfigService) => {
return new AuthGuard(configService.get('some_key'));
},
inject: [ConfigService],
},
],
})
При использовании APP_GUARD для provide защита будет инициализирована значением конфигурации. Так что это работает только для глобальной области видимости, но не для @UseGuards(AuthGuard).



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я бы попробовал менее подробный подход и внедрил ConfigService непосредственно в AuthGuard следующим образом:
@Module({
imports: [
CoreModule,
],
providers: [
AuthGuard,
],
exports: [
AuthGuard,
],
})
@Injectable()
export default class AuthGuard {
constructor (protected readonly config: ConfigService) {
}
/*
...
*/
}
Это не работает, потому что охранники не зарегистрированы в качестве поставщиков в модуле. Они напрямую создаются фреймворком.
Вы можете использовать инъекцию зависимостей в Guard:
@Injectable()
export class MyAuthGuard {
constructor(private readonly configService: ConfigService) {
// use the configService here
}
}
и
@UseGuards(MyAuthGuard)
или создайте охранник самостоятельно:
@UseGuards(new AuthGuard(configService.get('some_key')))
В особом случае AuthGuard вы можете установить defaultStrategy в PassportModule. Тогда вы можете просто использовать @UseGuards(AuthGuard())
PassportModule.register({ defaultStrategy: 'jwt'})
или асинхронно:
PassportModule.registerAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => ({ defaultStrategy: configService.authStrategy}),
inject: [ConfigService],
})
Привет! Спасибо за ответ. Взгляните, пожалуйста, на комментарий, добавленный для Игоря. Что вы думаете ?
Тогда я бы использовал defaultStrategy, как было предложено в моем ответе.
Все еще есть проблемы? :-)
Нет :) Спасибо, что поделились решением!
Привет! Спасибо за ответ. Чего я пытаюсь добиться, так это избавиться от configService, инициализировав его в провайдерах, как описано, что фактически работает для глобального контекста (используя APP_GUARD). Так что не пойму проблема это или нет. Что вы думаете ?