如果一个nodejs模块将一个对象导出到另外两个模块,那么在一个下游模块中对该对象所做的更改是否会传播到另一个下游模块
If a nodejs module exports an object to two other modules, do changes made to that object in one downstream module propagate to the other?
我最初在nodejs中有一个工作应用程序,它的所有代码都在一个文件中,使用构造函数和iife拆分为离散的块。为了提供合理的解耦和分离,我一直在尝试重构程序,使每个块驻留在不同的文件中,但我遇到了一个问题。
程序被分成三个核心块:
一个数据存储构造函数,初始化为连接Redis并返回Redis客户端和数据存储对象。
function CreateDataStore(storePort, storeUrl, passwd) {
var client
, datastore;
//create the redis client
//create the datastore
//exports
return {
"redisClient": client,
"dataObject": createSiteUpdater("")
};
}
var dataStore = CreateDataStore("xxxx","xxxx","xxxx");
var client = dataStore.redisClient;
var testResults = dataStore.dataObject;
一个网络爬虫构造器,它使用redis客户端并将数据存储在数据存储对象中。
function CreateWebCrawler(){
//do some stuff
//initialise robots.txt parser
return function() {
//crawl a page
//add page data to testResults object
}
}
一个web服务器构造函数,它读取相同的数据存储对象并将数据发送给前端客户端。
function CreateWebServer() {
//do some stuff
//initialise an express webserver
//initialise socket.io
//send testResults object out over a socket.
}
当它们在同一个文件中时,这一切都工作得很好,但是现在我想将它们重构到三个单独的文件中,我对它们如何相互通信感到困惑。
在新的架构下,web爬虫模块和web服务器模块都"需要"数据存储模块,该模块导出一个数据存储对象。我需要发生的是,网络爬虫模块对其数据存储对象所做的任何更改都要复制到web服务器模块可用的数据存储对象的版本中。
我试过看所有的nodejs文档,也做了很多谷歌搜索,但我不能为我的生活工作,如果一个commonjs模块的出口语句返回的对象是堆上的相同对象,当它分别返回到两个不同的其他模块更高的依赖关系图。有人能向我解释一下,如果这是真的,并理想地为我提供一个链接到正确的文档,以正确地理解行为吗?
我是这样做的:
var datastore = {};
module.exports = datastore;
var redis = require('redis');
var client = '';
var testResults = '';
datastore.CreateDataStore = function(storePort, storeUrl, passwd) {
client = redis.createClient(storePort,storeUrl);
redisClient.auth(passwd, function() {
console.log("redisAuth Connected!");
});
testResults = createSiteUpdater("");
}
datastore.setdata = function(data, callback){
client.set(data.key, data.value, callback);
}
第二个函数是数据库的访问器函数。我不确定这是不是最好的方法,但是如果需要的话,我可以轻松地换出不同的数据库,并且应该保存对数据存储对象的任何更改。而不是需要多个模块,传递单个对象
下面是一个更完整的示例,其中包含我编写的帐户管理器模块的几个数据库:
https://github.com/hortinstein/accountManager/tree/master/databaseMiddleware相关文章:
- Javascript,访问一个主要对象模块模式中的每个对象
- 错误:$injector:modulerr模块错误(我的第一个SPA应用程序)
- 如何定义一个模块并使用它来分离js文件
- 聚合物是一个框架而不是一个库.如何模块化地使用web组件
- 需要从一个文件中获取多个模块
- 在一个表达式中加载并使用ES6模块
- 在我的JavaScript模块中绑定一个点击事件
- ESDoc将我所有的模块方法放在一个标题下,而不是放在每个文件下,我该如何改变这种行为
- 从一个模块暴露到另一个模块
- 查找与锁定和更新调度相关的一个或两个节点模块
- NodeJS:一个全局EventEmitter或每个模块它'他自己的
- 如何将多个 AMD 模块捆绑在一个文件中
- 节点模块对象范围:在所有函数之间共享一个对象
- 从导出的模块返回变量,并在另一个文件(NodeJS)中使用它
- 在节点中.js“模块”始终是一个对象
- 在单独的模块中放入一个脚本
- Node.js创建一个模块来收集内存(ram)信息
- 如何从另一个模块调用函数
- 无法调用requirejs中的另一个模块
- 无法导入模块:您可能需要一个合适的加载程序