Инициализировать Guard со значением

Можно ли инициализировать защиту с указанным значением? Например, текущий пример не будет работать:

@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).

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
742
2

Ответы 2

Я бы попробовал менее подробный подход и внедрил ConfigService непосредственно в AuthGuard следующим образом:

@Module({
  imports: [
    CoreModule,
  ],
  providers: [
    AuthGuard,
  ],
  exports: [
    AuthGuard,
  ],
})
@Injectable()
export default class AuthGuard {
  constructor (protected readonly config: ConfigService) {
  }
  /*
  ...
  */
}

Привет! Спасибо за ответ. Чего я пытаюсь добиться, так это избавиться от configService, инициализировав его в провайдерах, как описано, что фактически работает для глобального контекста (используя APP_GUARD). Так что не пойму проблема это или нет. Что вы думаете ?

user2623505 08.02.2019 09:15

Это не работает, потому что охранники не зарегистрированы в качестве поставщиков в модуле. Они напрямую создаются фреймворком.

Вы можете использовать инъекцию зависимостей в 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],
}) 

Привет! Спасибо за ответ. Взгляните, пожалуйста, на комментарий, добавленный для Игоря. Что вы думаете ?

user2623505 08.02.2019 09:17

Тогда я бы использовал defaultStrategy, как было предложено в моем ответе.

Kim Kern 08.02.2019 15:46

Все еще есть проблемы? :-)

Kim Kern 11.02.2019 00:04

Нет :) Спасибо, что поделились решением!

user2623505 12.02.2019 08:53

Другие вопросы по теме