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



我正试图编写一个装饰器来简化我对mongodb调用的处理,无论是使用事务还是不使用来自单个服务方法的事务,如果它能工作,它都会为我节省大量的样板文件。

使用要点:

•一个服务类有很多写入数据库的方法,它有各种各样的使用者•每个方法都必须有选择地允许操作以事务方式运行•无法向mongodb的QueryOptions对象提供{session:null/defined},因为它将认为这是一个会话,更新操作将使失败

我的简化解决方案:

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仍将被定义,我不必在每个方法中再次定义它•我在decorator中设置了查询的基本选项,覆盖了提供的选项(通常只是新的:true(•我使我的服务方法的消费者能够提供额外的选择,尽管很少需要

我遇到的问题是:

•decorator只在运行时进行评估,console.log((将在构建时出现一次,然后在收到请求时什么都不做。

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

谢谢。

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

我所知道的唯一的方法是制作一个装饰师";活动的";在请求时,方法装饰器修改它所作用的方法,在我看来,这超出了装饰器的作用范围。

最新更新