我有一个基本的快速服务器,需要在每个请求处理期间存储一些全局变量。
更深入地说,请求处理涉及许多需要存储在变量中的操作,例如 global.transaction[]
当然,如果我使用 global
范围,每个连接都将共享其事务的信息,我需要一个全局范围,因为我需要在执行期间从许多其他模块访问事务数组。
关于这个问题有什么建议吗?我觉得这是非常微不足道的事情,但我正在寻找复杂的解决方案:)
非常感谢!
更新 这是一个案例场景,更清楚。
在每个请求中,我有 3 个模块(ModuleA
、ModuleB
、ModuleC
)读取一个目录中 10 个随机文件的内容。我想跟踪每个请求读取的文件名列表,并用 res.write
发送回列表。
所以 ModuleA/B/C
需要访问一种全局变量,但是列表 request_1
, request_2
, request_3
等等...不必混淆。
最佳答案
这是我的建议避免全局状态如火。
- 根据我的经验,这是 Node 服务器中的头号维护问题。
- 它使您的代码不可组合且更难重用。
- 它会在您的代码中创建隐式依赖关系 - 您永远无法确定哪一部分依赖于哪一部分,而且验证起来也不容易。
您希望应用程序的每一部分使用的代码部分尽可能明确。这是一个大问题。
问题
我们希望跨多个请求同步状态并相应地采取行动。这是编写软件中的一个非常大的问题——有人说甚至是最大的问题。应用程序中对象通信方式的重要性怎么估计都不为过。
一些解决方案
有几种方法可以在 Node 服务器中实现跨请求或服务器范围的共享状态。这取决于你想做什么。以下是两种最常见的 imo。
- 我想观察请求的作用。
- 我希望一个请求根据另一个请求所做的事情来做事。
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/