SetMetadata 更改守卫执行顺序 nestjs

SetMetadata changes guard execution order nestjs

当我包含 @Permissions('read') 我的 acessGuard 停止接收 JWT 信息时,@Permissions 只是设置元数据(下面的代码)

export const Permissions = (...permissions: string[]) => SetMetadata('permissions', permissions);

certificate.controller.ts:

@UseGuards(LocalAuthGuard, AccessGuard)
@Controller('certificate')
export class CertificateController {  
    constructor(private certificateService: CertificateService) {}
  
    @Get()
      @Permissions('read') // removing this req.user is filled with jwt data
      async getCertificates(@CurrentUser() user: User) {
        return this.certificateService.getCertificates(user.id);
    }

Bellow 是一个守卫,它将控制用户是否有权执行该操作

export class AccessGuard implements CanActivate {
   constructor(
     private readonly accessService: AccessService,
     @Inject('Reflector') private readonly reflector: Reflector,
   ) {}
    
     async canActivate(context: ExecutionContext): Promise<boolean> {
        const permissions = this.reflector.get<enAccessPoliciesModules[]>(
          'permissions',
          context.getHandler(),
        );
    
        console.log(context.switchToHttp().getRequest().user); // when i include @Permission('read') this line is undefined 
     }
}

估计跟执行顺序有关系,一开始是 LocalAuthGuard -> AccessGuard 但是在设置元数据之后它变成了 AccessGuard -> LocalAuthGuard,这样 request.user 是未定义的。

有什么解决方法吗?

我发现了问题

@Module({
  imports: [CoreModule, AuthModule, AccessPoliciesModule, CertificateModule],
  controllers: [AppController],
  providers: [
    AppService,
    { provide: APP_GUARD, useClass: AccessPoliciesGuard },
  ],
})
export class AppModule {}

因为我试图修复依赖性错误,所以我在 appModule 提供程序中添加了 APP_GUARD。我意识到守卫被执行了 2 次,第一次它没有令牌,因为它是全球守卫,我想我有优先权?