方案调研

简介: 方案调研

NestJS 原生支持

NestJS 原生支持请求级别的注入作用域,即实例在每个请求中都会实例化一遍,请求结束后实例销毁。官方文档


在这种注入模式下, ControllerService 中均可以通过如下方式获取到请求实例:

import { Injectable, Scope, Inject } from '@nestjs/common';
import { REQUEST } from '@nestjs/core';
import { Request } from 'express';
@Injectable({ scope: Scope.REQUEST })
export class CatsService {
  constructor(@Inject(REQUEST) private request: Request) {}
}点击复制复制失败已复制


其中 request 属性即是获取到的请求实例。关于此注入模式的详细阐述请转至笔记:NestJS依赖注入


此方案的局限性在于必须是 NestJS 管理的实例才行,超出 NestJS 的实例是无法注入的,例如: Typeorm 的订阅。


引入三方库进行魔改

上述方式已经能在一部分程度上实现上下文功能了,但是依旧有局限,我的场景就是上面提到的 Typeorm 的订阅,只能继续寻找方案了,在 NestJS 仓库中翻看 issue ,能够找到一篇和我的需求场景完全一致的 issueissue地址

这篇 issue 中提到三种解决方案,接下来分别介绍这三种解决方案。


Zone.js

由于篇幅有限,关于 Zone.js 库的相关内容请转至笔记:Zone.js

此方案在 NestJS 环境下失败了,原因未知,效果是在中间件中调用了 next 函数后, Zone.current.name 就变成了 <root> 了,而不是我们 fork 的,在其他地方就拿不到内容了,找了半天也没有找到原因。时间关系,暂时放弃,回过头来再搞。


  • 优点
  • 此库被Angular官方看中,目前已经转移至Angular仓库下,据说还提议node原生支持它,但现在也没有看到后续消息
  • 下载量可观,截止目前(2021-4-3),npm上周下载量达到了200w
  • 应用范围广,很多场景均有使用,稳定性得到保障
  • 更新速度较其他方案更快(其他方案的包已经三四年没有更新了)
  • 缺点
  • 集成失败,这个是致命缺点。。。


cls-hooked

此三方库的 GitHub 地址为:cls-hooked

最终选择的就是这个方案,集成到 NestJS 中运行很好,关于其原理后面有时间再介绍,这里只介绍一下优缺点


  • 优点
  • NestJS项目中表现很好,按照issue中的操作直接就成功了
  • npm上的下载量也不错,截止目前(2021-4-3),npm上周下载量达到了82w
  • 缺点
  • 是一个老包了,最后一次更新是4年前,似乎版本停滞了


node-request-context

此三方库的 GitHub 地址为:node-request-context

这个是最早我们采用的方案,但是现在不好使了,原因是现在我们采用 node 的最新 LTS 版本,为 14.x ,之前是 10.x12.x 都没有问题。最后定位到原因发现是因为这个包采用了在 node12.x 声明被废弃的 Domain API官方文档,所以在 node14 中直接就挂了,似乎作者也没有打算继续更新了,此方案直接 pass 吧。


扩展

尽管通过 issue 中给出的三种方案中的一种实现了目的,但是选用的 cls-hooked 这个包更新停滞,这个是我非常害怕的一点,就比如之前用的 node-request-context 一样,用得好好的,然后随着 node 版本的更新迭代,突然就挂了。很担心某一天 cls-hooked 也发生同样的问题,于是顺着这个包的 GitHub 地址去看,发现它 fork 于另一个包—— continuation-local-storage ,此包的地址为:GitHubnpm


cls-hooked 这个包 fork 后的目的主要是在 node8 及其以上的环境中采用 async_hooks 这个原生支持的新 API ,在 node8 之前使用 AsyncWrap 方式。

看来一下 continuation-local-storage 的下载量,在目前(2021-4-3),可以达到周下载量 140w ,最后一次更新是3年前,相比于 cls-hooked 好了一点,但是也没有好太多,既然已经采用了 cls-hooked 实现了需求,也就不换方案了,毕竟这个好处不足以促使我修改方案。

目录
相关文章
|
运维 JavaScript 数据可视化
数字化建设之路始于选型,企业该如何避免选型“坑”?
在转型建设的过程中,数字化系统的选型往往是最重要的环节,一旦选型不当或出现失误,将可能直接导致项目烂尾。因此,一个好的开端就是从选型开始的。
|
4月前
|
数据挖掘
数据研发问题之组织架构如何解决
数据研发问题之组织架构如何解决
|
6月前
|
监控 数据可视化 前端开发
高效设计企业营销系统的3种方案实践复盘
高效设计企业营销系统的3种方案实践复盘
137 2
|
机器学习/深度学习 存储 运维
Exabeam的UEBA调研
Exabeam的UEBA调研
1581 0
|
数据采集 安全 大数据
大型集团企业数据治理方案,以“应用驱动”的数据治理策略 | 行业方案
袋鼠云大型集团企业数据治理方案来啦!该数据治理策略以业务应用带动数据治理的能力建设,以业务创新推动数据治理的价值体现。
387 0
|
iOS开发
SwiftLint落地调研
在项目中加入lint来保证代码质量
252 0
|
监控 安全 Java
全链路压测(2):方案调研和项目立项
一般来说,像生产全链路压测这种复杂的需要多个技术团队参与的复杂技术项目,在企业内部都会有一个项目申报和评估立项的过程。
全链路压测(2):方案调研和项目立项
|
运维 架构师 项目管理
带你读《升舱 - 数据仓库升级交付标准白皮书》——3.3 升级实施交付阵型
带你读《升舱 - 数据仓库升级交付标准白皮书》——3.3 升级实施交付阵型
377 0
|
数据处理 数据库
带你读《升舱 - 数据仓库升级交付标准白皮书》——2.3 升级实施的五大关键点(上)
带你读《升舱 - 数据仓库升级交付标准白皮书》——2.3 升级实施的五大关键点(上)
222 0
|
运维 数据可视化 项目管理
带你读《升舱 - 数据仓库升级交付标准白皮书》——2.3 升级实施的五大关键点(下)
带你读《升舱 - 数据仓库升级交付标准白皮书》——2.3 升级实施的五大关键点(下)
261 0
下一篇
无影云桌面