NodeJS Express中每个请求的全局范围

Leo*_*ssi 7 javascript global-variables node.js express

我有一个基本的快速服务器,需要在每个请求处理期间存储一些全局变量.更深入的是,请求处理涉及许多需要存储在变量中的操作,例如global.transaction[]

当然,如果我使用global范围,每个连接将共享其事务的信息,我需要一个全局范围,因为我需要在执行期间从许多其他模块访问事务数组.

有关这个问题的任何建议吗?我觉得这是非常微不足道的事情,但我正在寻找复杂的解决方案:)

非常感谢!

更新 这是一个案例场景,更清楚.

在每次请求我有3个模块(ModuleA,ModuleB,ModuleC),其读出的10个随机文件的内容在一个目录中.我想跟踪每个请求读取的文件名列表,并返回res.write列表.

因此,ModuleA/B/C需要访问某种全局变量,但名单request_1,request_2,request_3等...没有混淆.

Ben*_*aum 10

这是我的建议,避免像火一样的全球状态.

  • 根据我的经验,这是Node服务器中的头号维护问题.
  • 它使您的代码无法组合,难以重用.
  • 它会在您的代码中创建隐式依赖关系 - 您永远无法确定哪个部分取决于哪个部分,并且验证起来并不容易.

您希望应用程序的每个部分使用的代码部分尽可能明确.这是一个很大的问题.

问题

我们希望跨多个请求同步状态并相应地执行操作.在编写软件时这是一个非常大的问题 - 有人说甚至是最大的问题.不能过高估计应用程序中对象通信方式的重要性.

一些解决方案

有多种方法可以在节点服务器中跨请求或服务器范围完成共享状态.这取决于你想做什么.这是两个最常见的imo.

  1. 我想观察请求的作用.
  2. 我想要一个请求根据另一个请求做了什么.

我想观察请求的作用

同样,有很多方法可以做到这一点.以下是我最常见的两个.

使用事件发射器

这种方式请求发出事件.应用程序读取请求触发的事件并相应地了解它们.应用程序本身可以是您可以从外部观察的事件发射器.

你可以这样做:

request.emit("Client did something silly",theSillyThing)l
Run Code Online (Sandbox Code Playgroud)

如果你选择的话,从外面听它.

使用观察者模式

这就像一个事件发射器,但相反.您在请求上保留一个依赖项列表,并在请求发生一些有趣的事情时自己调用一个处理程序方法.

就个人而言,我通常更喜欢事件发射器,因为我认为他们通常会更好地解决问题.

我想要一个请求根据另一个请求做什么.

这听起来不仅仅是琐碎.再次,这里有几种方法.他们的共同点是我们将共享服务

而不是具有全局状态 - 每个请求都可以访问服务 - 例如,当您读取文件时通知服务以及何时需要读取文件列表 - 您可以询问服务.依赖中的一切都是明确的.

该服务不是全局的,只是它的依赖性.例如,它可以协调资源和数据,是某种形式的存储库).

好理论!那我的用例怎么样?

以下是在您的案例中要做的两个选项.它远非唯一的解决方案.

第一种选择:

  • 每当模块读取文件时,每个模块都是一个事件发射器,它们发出一个事件.
  • 服务会监听所有事件并保持计数.
  • 请求可以显式访问该服务,并可以查询它以获取文件列表.
  • 请求通过模块本身而不是添加的服务执行写入.

第二种选择:

  • 创建一个拥有module1,module2和module3副本的服务.(组成)
  • 该服务根据模块的要求将操作委派给模块.
  • 该服务保留了自请求通过它访问以来访问的文件列表.
  • 请求不再直接使用模块 - 而是使用服务.

这两种方法都有优点和缺点.可能需要一个更复杂的解决方案(这两个在实践中非常简单),其中服务进一步抽象,但我认为这是一个良好的开端.