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

问题描述

我正在尝试编写一个装饰器来简化我对带有事务的 mongodb 调用的处理,而没有来自单个服务方法的事务,如果它可以工作,它将为我节省大量的样板文件。

使用要点:

• 服务类有多种消费者,其中有很多写入数据库的方法 • 每个方法必须可选地允许操作以事务方式运行 • 不能向 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 仍然会被定义,我不必在每个方法中再次定义它 • 我在装饰器中为查询设置基本的 opts,覆盖提供的 opts(通常是just new:true) • 我允许我的服务方法的消费者提供额外的选项,尽管很少需要

我遇到的问题是:

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

我怎样才能让这个装饰器适用于我的用例?我知道这在某种程度上是可能的,因为 NestJS 已经有一堆其他的控制器方法的装饰器,它们是可配置的并且做类似的事情。

谢谢你。

标签: javascriptnode.jstypescriptnestjstypescript-decorator

解决方案


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

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


推荐阅读