Typescript 方法参数装饰器仅在构建时评估,是否可以在请求时评估? (nodejs+nestjs)

Typescript method parameter decorator only evaluated at build time, is it possible to evaluate at request time? (nodejs+nestjs)

我正在尝试编写一个装饰器来简化我对使用 t运行saction 并且没有来自单个服务方法的 t运行saction 的 mongodb 调用的处理,它将节省如果可行的话,给我一大堆样板文件。

使用要点:

• 服务 class 有多种消费者,它有很多写入数据库的方法 • 每个方法必须有选择地允许操作 运行 t运行sactionally • 无法向 mongodb 的 QueryOptions 对象提供 {session: null/undefined},因为它将认为它是一个会话并且更新操作将失败

我的简化解决方案:

export function SetDbSession(opts?: QueryOptions): ParameterDecorator {
  return (target: QueryOptions, propertyKey: string): QueryOptions => {
    let options: QueryOptions = { ...opts };

    if (target.session) {
      options.session = target.session;
    }
    console.log("DECORATOR OPTIONS", options);
    return options;
  };
}

我的想法是在我的服务中使用这样的方法:

  public async write_to_database(
    _id: string,
    data: IMyData
    @SetDbSession({ new: true }) opts?: QueryOptions,
  ): Promise<Raise> {
...

这样:

• 如果他们根本不提供会话,opts 仍将被定义,我不必在每个方法中再次定义它 • 我在装饰器中设置查询的基本选项,覆盖提供的选项(通常只是 new:true) • 我允许使用我的服务方法的消费者提供额外的选项,尽管很少需要

我遇到的问题是:

• 装饰器仅在运行时进行评估,console.log() 将在构建期间出现 1 次,然后在请求进入时完全不执行任何操作。

如何让这个装饰器适用于我的用例?我知道这在某种程度上是可能的,因为 NestJS 已经为控制器方法提供了一堆其他装饰器,这些装饰器是可配置的并且可以做类似的事情。

谢谢。

装饰器只是一个开始时间构造。它们被评估为顶级功能并设置所需的元数据。您可以在运行时读取该元数据,这正是 Nest 所做的,使它们看起来像是在请求时进行评估,而实际上元数据只是被读取并根据其执行。

我所知道的使装饰器在请求时“激活”的唯一方法是让方法装饰器修改它所作用的方法,在我看来,这超出了装饰器的范围。