gpt4 book ai didi

node.js - NestJS:如何使用自定义装饰器访问 Controller 函数响应?

转载 作者:行者123 更新时间:2023-12-03 07:59:36 34 4
gpt4 key购买 nike

这是我的装饰器

import { createParamDecorator, ExecutionContext } from "@nestjs/common";

export const CacheData = createParamDecorator(
(data: any, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
console.log(request.url, request.method, 'request');
const response = ctx.switchToHttp().getResponse();
const reqBody = request.body;
console.log(reqBody, 'reqBody');
console.log(response.raw.req.data, 'response');
console.log(response.raw.req.body, 'response');
console.log(response.raw.data, 'response');
console.log(response.cacheData, 'response');
}
);

在我的 Controller 函数中,我使用装饰器如下:

getStringsArr(
@Headers('Authorization') auth: string,
@Headers('Country') country = 'DK',
@CacheData() cacheData,
): Array<string> {
return ['Hello', 'World', '!'];
}

那么如何在 CacheData 装饰器中访问响应数据?

最佳答案

您的 CacheData 装饰器是一个 param 装饰器,这意味着,据我所知,它仅在调用方法处理程序时才会执行。你有几个选择。这里有两个。

选项 A - 方法装饰器

方法装饰器可以让您访问函数返回的数据,但也有缺点:与参数装饰器不同,您无权访问执行上下文,并且注入(inject)客户服务不太优雅。我喜欢这个选项,因为它很容易向装饰器提供参数。

由于您的示例是关于缓存的,我怀疑您会想要在那里注入(inject)您的服务,因此选项 B 可能更适合您的要求,但这里有一个带有方法装饰器的实现:

const MyMethodDecorator = (params) => {
return (
target: Record<string, unknown>,
_propertyKey: string,
descriptor: PropertyDescriptor,
) => {
const originalMethod = descriptor.value;
descriptor.value = async function (...args) {
const data = await originalMethod.apply(this, args);
// data = ['Hello', 'World', '!']
};

return descriptor;
};
};

@MyMethodDecorator({ ttl: 120, cacheKey: 'stringsArr' })
getStringsArr(
@Headers('Authorization') auth: string,
@Headers('Country') country = 'DK'
): Array<string> {
return ['Hello', 'World', '!'];
}

选项 B - 路由拦截器

拦截器使依赖注入(inject)变得容易,因为它就像任何其他 NestJS 服务一样。我建议阅读并理解request lifecycle您选择这个选项吗?

与装饰器相比,一个缺点是提供参数不太优雅,但可以使用反射和方法装饰器实现:

import { applyDecorators, SetMetadata, UseInterceptors } from '@nestjs/common';

@Injectable()
export class MyInterceptor implements NestInterceptor {

constructor(private readonly reflector: Reflector) {}

intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const params = this.reflector.get('MyInterceptorMetadataKey', context.getHandler());
// params = { ttl: 120, cacheKey: 'stringsArr' }

return next.handle().pipe(
tap((response) => {
// data = ['Hello', 'World', '!']
}),
);
}
}

const MyMethodDecorator = (params) =>
applyDecorators(SetMetadata('MyInterceptorMetadataKey', params));

@UseInterceptors(MyInterceptor)
@MyMethodDecorator({ ttl: 120, cacheKey: 'stringsArr' })
getStringsArr(
@Headers('Authorization') auth: string,
@Headers('Country') country = 'DK'
): Array<string> {
return ['Hello', 'World', '!'];
}

关于node.js - NestJS:如何使用自定义装饰器访问 Controller 函数响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74810230/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com