Nest无法解析包装在装饰器中的卫队的依存关系

时间:2019-03-24 15:06:09

标签: javascript node.js typescript dependency-injection nestjs

我正在尝试将提供程序注入包装在装饰器中的防护中,但是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 { }

我不知道我是否正在使用适当的方法,或者即使我有可能尝试做任何事情,任何线索也将不胜感激!

1 个答案:

答案 0 :(得分:0)

通常,您的解决方案似乎可以正常运行,请参见以下运行示例:

Edit custom-decorator-injection


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

1)在您的AppModule中,AuthService不可用,因为AuthModule既不直接导入也不由SecuredModule导出。这就是为什么您会收到错误消息。

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

3)您要多次提供AuthService,因此您将拥有不同的实例。您只应提供一次,然后export(或重新导出)您的提供者,而不能再次提供。

4)ReflectMetadata在v6中已弃用;改用SetMetadata