我正在尝试将一个提供程序注入一个包含在装饰器中的防护,但是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);
}
}
这是我的SecuredGuard
,AuthService
是无法解决的依赖:
@Injectable()
export class SecuredGuard implements CanActivate {
constructor(
private readonly _reflector: Reflector,
private readonly _authService: AuthService
) { }
async canActivate(context: ExecutionContext): Promise<boolean> {...}
}
secured.guard.ts
和secured.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 { }
我不知道我是否正在使用适当的方法,或者即使可能我正在尝试做什么,任何线索都会非常感激!