如果一个nodejs模块将一个对象导出到另外两个模块,那么对一个下游模块中的该对象所做的更改会传播给另一个模块吗?

我最初在nodejs中有一个工作的应用程序,它将所有的代码放在一个文件中,使用构造函数和IIFE分成不连续的块。 为了提供明智的解耦和分离,我一直在试图重构程序,使每个块存在于不同的文件中,但我遇到了一个问题。

该scheme分为三个核心块:

初始化连接到Redis并返回redis客户端和dataStore对象的数据存储区构造函数。

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客户端并将数据存储在数据存储区对象中的Websearch器构造器。

 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服务器模块都“要求”数据存储模块,该模块导出一个dataStore对象。 我需要做的是将web crawler模块对其dataStore对象所做的任何更改复制到可用于Web服务器模块的dataStore对象的版本中。

我已经尝试通过所有的nodejs文档,并做了大量的谷歌search,但我不能为我的生活工作,如果一个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); } 

第二个函数是对我的数据库的访问函数。 不知道这是最好的方法,但是如果需要,可以轻松地交换不同的数据库,并且应该保存对数据存储对象的任何更改。 不要求多个模块,而是传递单个对象

这是一个更完整的例子,我写了一个账户pipe理模块的几个数据库:

https://github.com/hortinstein/accountManager/tree/master/databaseMiddleware