用值初始化Guard

时间:2019-02-06 07:43:05

标签: javascript node.js typescript nestjs

是否可以使用指定值初始化防护? 例如,当前示例不起作用:

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

2 个答案:

答案 0 :(得分:1)

这不起作用,因为防护未在模块中注册为提供程序。它们直接由框架实例化。

您可以在防护中使用依赖项注入:

@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],
}) 

答案 1 :(得分:0)

我会尝试使用更简洁的方法,并以这种方式将ConfigService直接注入AuthGuard:

dims=dict(q: [n])
@Module({
  imports: [
    CoreModule,
  ],
  providers: [
    AuthGuard,
  ],
  exports: [
    AuthGuard,
  ],
})