Node.js 共享对象或单例以确保单一事实来源

bra*_*ipt 2 singleton node.js node-modules

我正在编写一个 Node 应用程序,它将根据从后端数据库提取的配置生成一组 JMS 队列订阅。初始化后,我将从后端检索当前状态,但随后我需要支持对 Node 服务器的入站 API 调用,以动态添加和远程订阅(然后我将更新存储在后端的列表)。

整个应用程序中必须只有一个可用的订阅数组实例,并且它必须是事实来源。

例子:

在 init 时,我会从 API 得到:

{
    "amysCar": {
        "name": "2016 Lamborghini Gallardo LP 550-2",
        "queue": "/queues/amysracingstats"
    },
    "bobsCar": {
        "name": "1967 Ford Mustang Shelby Shelby GT500",
        "queue": "/queues/bobsrestorationproject"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后假设鲍勃决定不再想要发布他的修复项目;他将对 Node 服务器进行 API 调用DELETE /projects/bobsCar。我将从队列数组中删除队列侦听器并更新后端数据库。


实际上,我需要能够从多个控制器访问 JMS 队列数组,因为处理 API 调用的控制器与处理队列订阅的控制器是分开的。

我知道单例在 Node 中编写和管理是出了名的困难,令人不悦,而且据说完全没有必要,因为 Node.js 模块缓存据说只加载模块的单个实例。如果这是正确的,我可以简单地将队列订阅数组作为私有对象存储在模块中,然后将require其存储在 API 调用控制器中。

  1. 这是真的?我可以利用这个能力来满足我的要求吗?

  2. 如果是这样,我将如何覆盖模块的初始化,以便我可以进行初始后端调用来获取当前状态?

  3. 我是不是想太多了?

jfr*_*d00 5

  1. 这是真的?我可以利用这个能力来满足我的要求吗?

是的,它是真实的。只需使用模块属性即可。由于模块缓存的原因,只有一个这样的属性。

  1. 如果是这样,我将如何覆盖模块的初始化,以便我可以进行初始后端调用来获取当前状态?

我假设模块本身只会进行后端调用来初始化状态。它可以在首次加载时或通过第一个模块构造函数调用来执行此操作。

  1. 我是不是想太多了?

您似乎已经了解模块缓存以及模块属性如何作为单例工作,因此如果您仍然试图避免使用该功能,那么那就是想太多了。但是,如果您只是在依赖它之前确认它是如何工作的,那没有问题。