【发布时间】:2023-02-16 00:03:57
【问题描述】:
我在这里找到的相关问题:
- Get Method Name in TypeScript class - 我这里有一些有用的东西。
- How to get method name in method decorator。
- Typescript decorators - get decorator names of a property/class。
-
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