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

标签 javascript node.js express global-variables

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

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

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

非常感谢!

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

在每个请求中,我有 3 个模块(ModuleAModuleBModuleC)读取一个目录中 10 个随机文件的内容。我想跟踪每个请求读取的文件名列表,并用 res.write 发送回列表。

所以 ModuleA/B/C 需要访问一种全局变量,但是列表 request_1, request_2, request_3 等等...不必混淆。

最佳答案

这是我的建议避免全局状态如火

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

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

问题

我们希望跨多个请求同步状态并相应地采取行动。这是编写软件中的一个非常大的问题——有人说甚至是最大的问题。应用程序中对象通信方式的重要性怎么估计都不为过。

一些解决方案

有几种方法可以在 Node 服务器中实现跨请求或服务器范围的共享状态。这取决于你想做什么。以下是两种最常见的 imo。

  1. 我想观察请求的作用。
  2. 我希望一个请求根据另一个请求所做的事情来做事。

1。我想观察请求做了什么

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

使用event emitter

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

你可以这样做:

request.emit("Client did something silly", theSillyThing);

然后如果您愿意可以从外面听。

使用观察者模式

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

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

2。我希望一个请求根据另一个请求所做的事情来做事。

这比仅仅聆听要复杂得多。同样,这里有几种方法。他们的共同点是我们把分享放在一个service

与其拥有全局状态 - 每个请求都可以访问服务 - 例如,当您读取文件时通知服务,当您需要读取文件列表时 - 您询问服务。依赖关系中的一切都是明确的。

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

不错的理论!那么我的用例呢?

对于您的情况, 会做些什么,这里有两个选项。这远非唯一的解决方案。

第一个选项:

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

第二个选项:

  • 创建一个拥有 module1、module2 和 module3 副本的服务。 (作文)
  • 服务根据对它的要求将操作委托(delegate)给模块。
  • 该服务会保留自通过它发出请求以来访问过的文件列表。
  • 请求停止直接使用模块 - 而是使用服务。

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

关于javascript - NodeJS Express 中每个请求的全局范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19925857/

相关文章:

Javascript 将 URL 转换为 ‘anchor’ 标签并将标签作为字符串存储在数组中

javascript - 垂直和水平对齐文本链接跨越背景图像

java - 如何在 spring 中加载 javascript i18n 属性文件?

javascript - Node JS从mongodb返回数据时出错

javascript - 如何发出错误以便可能在客户端的错误处理程序中捕获它?

node.js - Sequelize 中的属于与拥有许多

javascript - 根据选择选项的值更改ajax url

node.js - CloudFormation更新堆栈

javascript - Node.js 数组实例化

node.js - html 到文件缓存的模块