如果一个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 如果 两个      更新时间:2023-09-26

我最初在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