【问题标题】:NestJS: wrap 3rd party decorator & setMetaData in order to use Reflector to check annotationNestJS:包装 3rd 方装饰器和 setMetaData 以便使用反射器检查注释
【发布时间】: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(){
  ...
}

我的问题:

  1. 有没有办法使用Reflector来检查MyGuard里面的控制器方法中是否出现了3rd方注解?

  2. 如果不使用setMetadata & 就没有办法,因为我不知道要检查哪个元数据密钥,因为第 3 方库。我怎样才能在我的自定义装饰器中setMetadata自己来实现我的需要?

【问题讨论】:

    标签: nestjs


    【解决方案1】:

    为什么不使用Nest's applyDecorators,这样您就可以将多个装饰器组合成一个装饰器?

    export const MyProtected = () => applyDecorators(
      Protected(),
      SetMetadata(IS_PROTECTED, true)
    );
    

    【讨论】:

    • 谢谢。看起来很棒。我是 NestJS 的新手,不知道。我明天试试
    猜你喜欢
    • 2021-04-11
    • 2015-08-19
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2023-03-23
    • 2022-09-21
    • 1970-01-01
    相关资源
    最近更新 更多