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

标签 node.js singleton node-modules

我正在编写一个 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"
    }
}

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


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

我知道单例在 Node 中编写和管理是出了名的困难,令人不悦,据称 completely unnecessary因为 Node.js 模块缓存据说只加载模块的单个实例。如果这是正确的,我可以简单地将队列订阅数组存储为模块中的私有(private)对象,然后在 API 调用 Controller 中require 它。

  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?

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

关于Node.js 共享对象或单例以确保单一事实来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32360242/

相关文章:

java - Singleton Util 类的替代方案

inno-setup - Inno Setup Compiler "Cannot find the path specified"错误,路径长

node.js - 更新所有记录的子文档数组中的字段

node.js - 很难理解express.js中的 'next/next()'

javascript - 如何创建传递构造函数参数的单例类实例?

c++ - 在 C++ 中,单例(静态实例)一旦程序退出就会被销毁的原因是什么

typescript - 当 tsc 为 webpack 时,webpack 无法捆绑文件

node.js - 没有规则可以创建目标 `node_modules/node-gyp/addon.gypi` , `Makefile' 需要

node.js - 在 Azure 上部署 React 项目

javascript - NestJS 设计响应结构