typescript Nestjs:反射器未注入自定义装饰器

wqsoz72f  于 2023-01-14  发布在  TypeScript
关注(0)|答案(1)|浏览(131)

我知道网站上还有其他同名的问题,但我的上下文非常不同,所以我会问。
我目前有一个Turborepo这样的:

apps/api
packages/pkg/PkgModule
packages/pkg/auth/AuthModule
packages/pkg/auth/PkgAuthStrategy
packages/pkg/auth/PkgAuthGuard

PkgModule导入和重新导出PkgAuthModule,PkgAuthModule如下所示:

@Module({ 
 imports: [ConfigModule, PkgAuthModule],
 providers: [PkgService],  
 exports: [PkgService, PkgAuthModule]
})
export class PkgModule {}

PkgAuthModule看起来像这样

@Module({
  imports: [PassportModule.register({ session: false }), ConfigModule],
  providers: [PkgAuthStrategy, ConfigService],
  exports: [PkgAuthStrategy]
})
export class PkgAuthModule {}

我的策略现在只是返回true。我的保护扩展AuthGuard('pkg-auth')。我的问题是在我的auth保护中,当我使用this.reflector.getAllAndOverride<boolean>时,reflector的计算结果为undefined。
验证防护:

@Injectable()
export class PkgAuthGuard extends AuthGuard('pkg-auth') {
  constructor(private reflector: Reflector) {
    super()
  }

  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    console.log(this.reflector)
    const isPublic = this.reflector.getAllAndOverride<boolean>('public', [
       context.getHandler(),
       context.getClass(),
    ])

    if (isPublic) return true

    return super.canActivate(context)
  }
}

在API中,我只是简单地导入了pkgModule。当在api控制器中使用guard时,它不能正确地注入Reflector。
保护定义和用法如下:

export const Protected = () => UseGuards(PkgAuthGuard)

api.controller:

@Protected()
@Post('/<endpoint>')
public async endpoint(@Body() body: any) {
...
}

小背景:我有两个认证策略,Firebase和Pkg。PkgAuth用于验证Webhook推送器。Firebase由用户使用,运行良好。它们在设置中彼此相似,唯一显著的区别是PkgAuth在我的monorepo中是一个单独的包。

7kqas0il

7kqas0il1#

我发现ConfigModule也没有被注入,所以开始更积极地调查。结果,因为我的模块在一个单独的Turborepo包中,然后被我的Turborepo应用程序捆绑和使用,我需要再次定义所有Nestjs依赖项:
$ yarn add @nestjs/common @nestjs/core reflect-metadata rxjs

相关问题