【发布时间】:2021-12-02 11:26:02
【问题描述】:
我正在使用 NestJS 来实现一个带有 TypeScript 的项目。
我正在使用一个第三方库,它提供了一个名为 Protected 的装饰器,我可以使用该装饰器来注释我的控制器方法:
@Protected()
myFunc(){
...
}
我有一个Guard,我想在其中检查注释是否存在于我的MyGuard 类中。我试过了:
@Injectable()
export class MyGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(context: ExecutionContext): Promise<boolean> {
const value = this.reflector.get('Protected', context.getHandler());
console.log(`VALUE: ${metaValue}`);
...
}
}
日志消息显示VALUE: undefined。我阅读了 NestJS 文档,有一个使用 setMetadata() 的示例,然后在 Guard 方法中使用元数据键检索元数据以检查注释是否存在。但是,这是一个 3rd 方装饰器,我没有任何信息告诉我他们是否使用任何元数据密钥。
所以,我想出了一个解决方法,我创建了自己的自定义装饰器,它包装了第 3 方 Protected 装饰器,并在控制器方法上使用我的装饰器:
import {Protected} from '3rd-party-lib'
import { SetMetadata } from '@nestjs/common';
export const MyProtected = () => {
Protected();
SetMetadata(IS_PROTECTED, true);
}
但是现在,控制器方法上的注释引发了错误:
/**
ERROR: Unable to resolve signature of method decorator when called as an expression.
This expression is not callable.
Type 'void' has no call signatures.ts(1241)
**/
@MyProtected()
myFunc(){
...
}
我的问题:
-
有没有办法使用
Reflector来检查MyGuard里面的控制器方法中是否出现了3rd方注解? -
如果不使用
setMetadata& 就没有办法,因为我不知道要检查哪个元数据密钥,因为第 3 方库。我怎样才能在我的自定义装饰器中setMetadata自己来实现我的需要?
【问题讨论】:
标签: nestjs