Boy*_* Li 2 node.js typescript nestjs
我正在尝试构建一个装饰器来“记录”请求信息
export const Tracking = () => {
return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {
const method = descriptor.value;
descriptor.value = async function(...args: any[]) {
console.log(/** Request info */)
console.log(/** Headers, Body, Method, URL...*/)
return method.call(this, ...args);
}
}
}
Run Code Online (Sandbox Code Playgroud)
并尝试在这样的控制器方法上使用它。
export class Controller {
@Get('/path')
@Tracking()
public async getData(@Headers('user') user: User) {
return this.service.getData(user.id);
}
}
Run Code Online (Sandbox Code Playgroud)
如果这是不可能的,有没有办法将拦截器应用于控制器的某些方法?
或者是否存在用于请求的线程(类似)级上下文?
谢谢!!
由于装饰器的本质,装饰器无权访问请求信息。它是一个高阶函数,调用它来设置类、类成员、类方法或类方法参数的元数据。该元数据可以在运行时读取,但本质上是在文件导入后立即调用和设置。因此,无法在每个请求上调用装饰器,即使是 Nest 的@Body()和@Req()也是在导入时调用并在请求时读取(实际上更早,但这不是重点)。
您在这里寻找的听起来更像是一个拦截器,就像 Micael Levi 和 hoangdv 已经提到的那样。Nest 文档显示了一个基本的日志记录示例,并且有像@ogma/nestjs-module(免责声明:我是作者)这样的包可以为您处理此请求日志记录/跟踪,包括添加相关 ID。
| 归档时间: |
|
| 查看次数: |
4640 次 |
| 最近记录: |