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

时间:2013-06-05 10:16:53

标签: javascript node.js refactoring commonjs

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

该程序分为三个核心块:

一个数据存储区构造函数,它初始化为连接到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;

Web爬网程序构造函数,它使用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服务器模块都“需要”数据存储模块,该模块导出dataStore对象。我需要做的是Web爬虫模块对其dataStore对象所做的任何更改都要复制到Web服务器模块可用的dataStore对象版本中。

我已经尝试查看所有的nodejs文档,并且还完成了大量的谷歌搜索,但是如果一个commonjs模块的export语句返回的对象是相同的,我就无法解决这个问题。堆上的对象,当它分别返回到依赖关系图上方的两个不同的其他模块时。任何人都可以向我解释这是否属实,并且理想情况下为我提供正确文档的链接以正确理解行为?

1 个答案:

答案 0 :(得分:1)

这是我的方式:

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