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 所做的,使它们看起来像是在请求时进行评估,而实际上元数据只是被读取并根据其执行。
我所知道的使装饰器在请求时“激活”的唯一方法是让方法装饰器修改它所作用的方法,在我看来,这超出了装饰器的范围。
我正在尝试编写一个装饰器来简化我对使用 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 所做的,使它们看起来像是在请求时进行评估,而实际上元数据只是被读取并根据其执行。
我所知道的使装饰器在请求时“激活”的唯一方法是让方法装饰器修改它所作用的方法,在我看来,这超出了装饰器的范围。