javascript - 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 已经有一堆其他的控制器方法的装饰器,它们是可配置的并且做类似的事情。
谢谢你。
解决方案
装饰器只是一个开始时间的构造。它们被评估为顶级功能并设置所需的元数据。您可以在运行时读取该元数据,这就是 Nest 所做的,使它看起来像是在请求时评估它们,而实际上元数据只是被读取和执行。
我知道在请求时使装饰器“活动”的唯一方法是让方法装饰器修改它所作用的方法,在我看来,这超出了装饰器的范围。
推荐阅读
- xml - 使用 XSL 和自结束标记转换 XML
- html - 响应式设计结合 Bootstrap 和 Django 不起作用
- python - Pandas(默认情况下)是重用内存还是制作副本?
- reactjs - React 组件返回 JSX 后不直接绘制
- node.js - 在将发行版推送到机器以进行进一步构建之前捆绑选择依赖项
- javascript - 如何将来自 ajax 调用的数据附加到 ul 中的 div
- rcpp - 在 RcppArmadillo 中使用 qr 分解的问题
- kubernetes - POD 是否将在容器中读取的文件缓存在 POD 的内存中?
- php - 传入变量
- react-native - React Native 删除 TextInput 自动完成的黄色背景