【问题标题】:Is there a way to get request context within a decorator in Nest JS有没有办法在 Nest JS 的装饰器中获取请求上下文
【发布时间】:2021-08-08 15:54:00
【问题描述】:

我正在尝试构建一个装饰器来“记录”请求信息

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);
    }
  }
}

并尝试在这样的控制器方法上使用它。

export class Controller {

  @Get('/path')
  @Tracking()
  public async getData(@Headers('user') user: User) {
    return this.service.getData(user.id);
  }
}

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

谢谢!!

【问题讨论】:

标签: node.js typescript nestjs


【解决方案1】:

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

您在这里寻找的东西听起来更像是一个拦截器,就像 Micael Levi 和 hoangdv 已经提到的那样。 Nest 文档 show a basic logging example,还有像 @ogma/nestjs-module 这样的包(免责声明:我是作者)为您处理此请求记录/跟踪,包括添加相关 ID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多