Nest无法解析装饰器中包含的guard的依赖关系

问题描述 投票:1回答:1

我正在尝试将一个提供程序注入一个包含在装饰器中的防护,但是Nest无法解析依赖关系,这给了我下一个错误:

[ExceptionHandler] Nest can't resolve dependencies of the SecuredGuard (Reflector, ?). Please make sure that the argument at index [1] is available in the SecuredGuard context.

我的方法的主要目的是避免使用两个单独的装饰器,如下所示:


@Controller()
export class AppController {

  @Get()
  @Secured('admin')
  @UseGuards(SecuredGuard)
  getHello(): string {
    return this.appService.getHello();
  }

}

而是将@UseGuards(SecuredGuard)插入我的自定义装饰器@Secured('admin')中,所以最终会像这样:

@Controller()
export class AppController {

  @Get()
  @Secured('admin')
  getHello(): string {
    return this.appService.getHello();
  }

}

这就是我实现自定义装饰器的方式:

export function Secured(...roles: string[]){ 

    const setMetadata = ReflectMetadata('roles', roles)
    const setupGuard = UseGuards(SecuredGuard)

    return (target: any, key?: string, descriptor?: any) => {
        setMetadata(target, key, descriptor);
        setupGuard(target, key, descriptor);
    }

}

这是我的SecuredGuardAuthService是无法解决的依赖:

@Injectable()
export class SecuredGuard implements CanActivate {

  constructor(
    private readonly _reflector: Reflector,
    private readonly _authService: AuthService
  ) { }

  async canActivate(context: ExecutionContext): Promise<boolean> {...}
}

secured.guard.tssecured.decorator.ts都是secured.module.ts的一部分

@Module({
    imports: [
        SecuredGuard,
        AuthModule
    ],
    exports: [
        SecuredGuard
    ],
    providers: [
        AuthService
    ]
})
export class SecuredModule {}

这是使用从AuthService出口的auth.module.ts

@Module({
  controllers: [
    AuthController
  ],
  providers: [
    AuthService
  ],
  imports: [
    EmailModule
  ],
  exports: [
    AuthService
  ]
})
export class AuthModule { }

secured.module.ts正在进口app.module.ts

@Module({
  imports: [
    SecuredModule
  ],
  controllers: [
    AppController
  ],
  providers: [
    AppService
  ],
})
export class AppModule { }

我不知道我是否正在使用适当的方法,或者即使可能我正在尝试做什么,任何线索都会非常感激!

javascript node.js typescript dependency-injection nestjs
1个回答
0
投票

通常,您的解决方案似乎有效,请参阅此运行示例:

Edit custom-decorator-injection


但是,模块声明中存在一些错误:

1)在你的AppModule中,AuthService不可用,因为AuthModule既不是直接进口的,也不是SecuredModule出口的。这就是你收到错误的原因。

2)您不必在任何模块中声明您的警卫,它们将在全球范围内可用。只将模块放在imports数组中。

3)你多次提供AuthService,所以你会有不同的实例。您应该只提供一次,然后只提供export(或再出口)您的提供商,但不能再次提供。

4)ReflectMetadata在第6版中被弃用;改用SetMetadata

© www.soinside.com 2019 - 2024. All rights reserved.