有没有办法在 Nest JS 的装饰器中获取请求上下文

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)

如果这是不可能的,有没有办法将拦截器应用于控制器的某些方法?
或者是否存在用于请求的线程(类似)级上下文?

谢谢!!

Jay*_*iel 5

由于装饰器的本质,装饰器无权访问请求信息。它是一个高阶函数,调用它来设置类、类成员、类方法或类方法参数的元数据。该元数据可以在运行时读取,但本质上是在文件导入后立即调用和设置。因此,无法在每个请求上调用装饰器,即使是 Nest 的@Body()@Req()也是在导入时调用并在请求时读取(实际上更早,但这不是重点)。

您在这里寻找的听起来更像是一个拦截器,就像 Micael Levi 和 hoangdv 已经提到的那样。Nest 文档显示了一个基本的日志记录示例,并且有像@ogma/nestjs-module(免责声明:我是作者)这样的包可以为您处理此请求日志记录/跟踪,包括添加相关 ID。