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

Node.js shared object or singleton to ensure a single source of truth

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

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

示例:

在初始化时,我会从 API:

{
    "amysCar": {
        "name": "2016 Lamborghini Gallardo LP 550-2",
        "queue": "/queues/amysracingstats"
    },
    "bobsCar": {
        "name": "1967 Ford Mustang Shelby Shelby GT500",
        "queue": "/queues/bobsrestorationproject"
    }
}

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


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

我知道单例在 Node 中是出了名的难以编写和管理,不受欢迎,据说 completely unnecessary 因为 Node.js 模块缓存据说只加载模块的单个实例.如果那是正确的,我可以简单地将队列订阅数组作为私有对象存储在模块中,然后 require 它在 API 调用控制器中。

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

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

  3. 我是不是想多了?

  1. Is this true? Can I use this ability to meet my requirement?

是的,这是真的。只需使用一个模块 属性。由于模块缓存,只有一个这样的 属性.

  1. If so, how would I overwrite the initialization of the module so that I can make that initial backend call to get the current state?

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

  1. Am I overthinking this?

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