【问题标题】:How to get name of a method in NestJS via a decorator?如何通过装饰器获取 NestJS 中方法的名称?
【发布时间】:2023-02-16 00:03:57
【问题描述】:

我在这里找到的相关问题:

  1. Get Method Name in TypeScript class - 我这里有一些有用的东西。
  2. How to get method name in method decorator
  3. Typescript decorators - get decorator names of a property/class
  4. Get Method Name in TypeScript class

    问题:我需要创建一个或多个装饰器来获取类名和方法名。有必要创建一个方便的错误处理程序,以人类可读的格式记录错误的位置。

    我现在拥有的:

    授权/认证控制器(gateway/src/auth.controller.ts):

    @ClassName // <---- It works, see the code in a listing below.
    @Controller('auth')
    @ApiTags('auth')
    export class AuthController {
      constructor(
        private readonly configService: ConfigService,
        private readonly authService: AuthService,
        @Inject('USER_SERVICE') private readonly userServiceClient: ClientProxy,
      ) {
      }
    
      // @MethodName
      @Post('register')
      public async register(
        @Body() body: RegisterBodyDto,
      ): Promise<IResponse<{ user: IUser }>> {
        // @ts-ignore
        console.log('className:', this.__className); // Output: className: AuthController
    
        return await lastValueFrom(
          this.userServiceClient
            .send(USERS_EVENTS.USER_CREATE_USER, body)
            .pipe(timeout(MAX_TIME_OF_REQUEST_WAITING)),
        );
      }
    
      // ... etc.
    
    }
    

    ClassName装饰器(gateway/src/common/decorators/class-name.decorator.ts)的代码:

    export function ClassName<T extends { new(...args: any[]): {}}>(target: T) {
      return class extends target {
        constructor(...args) {
          super(...args);
        }
    
        public __className: string = target.name;
      };
    }
    

    当我在第一个列表中取消注释时,在 cmets 中有一个类方法和输出的类似装饰器的代码(它没有像我预期的那样工作,gateway/src/common/decorators/method-name.decorator.ts):

    export function MethodName<A extends any[], R>(
      target: Object,
      methodName: string,
      descriptor: TypedPropertyDescriptor<(...args: A) => Promise<R>>,
    ) {
      const method = descriptor.value;
    
      console.log('target', target); // Output: target {}
      console.log('methodName', methodName); // Output: methodName register
      console.log('descriptor', descriptor);
      /* Output: 
      descriptor {
        value: [AsyncFunction: register],
        writable: true,
        enumerable: false,
        configurable: true
      }
      */
      console.log('descriptor.value', descriptor.value); // Output: descriptor.value [AsyncFunction: register]
    
      descriptor.value = async function(...args: A): Promise<R> {
        console.log(methodName); // <--- Doesn't work
        return await method.apply(target, args);
      };
    
      console.log('descriptor.value', descriptor.value); // Output: descriptor.value [AsyncFunction (anonymous)]
    }
    

    当我在第一个列表中取消注释 @MethodName 时,出现 404 错误:

    { “状态”:404, “数据”:空, “错误”:[ “无法发布 /api/v1/auth/register” ] }

    没有装饰器它运行良好。

    那么,如何更改MethodName装饰器的代码来获取当前运行方法的名称呢?

【问题讨论】:

    标签: javascript typescript nestjs decorator typescript-decorator


    【解决方案1】:

    也许其他人正在寻找答案。

    我通过这样的装饰器获取方法名称:

    export const GetMethodName = createParamDecorator(
      (context: ExecutionContext): string => {
        return context.getHandler().name;
      },
    );
    

    方法.controller.ts

       async signIn(
            @GetMethodName() methodName: string,
            .......): Promise<any> {
            console.log(methodName) // => signIn
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-15
      • 2012-02-28
      • 1970-01-01
      • 2017-09-25
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      相关资源
      最近更新 更多