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

标签 javascript node.js refactoring commonjs

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

该程序分为三个核心 block :

一个数据存储构造函数,用于初始化连接到 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.
}

当它们位于同一个文件中时,这一切都工作得很好,但现在我想将它们重构为三个单独的文件,我对它们将如何相互通信感到困惑。

在新架构下,网络爬虫模块和网络服务器模块都“需要”数据存储模块,该模块导出数据存储对象。我需要做的是,网络爬虫模块对其 dataStore 对象所做的任何更改都将复制到 Web 服务器模块可用的 dataStore 对象版本中。

我尝试过查看所有的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 - 如果 Nodejs 模块将一个对象导出到其他两个模块,那么一个下游模块中对该对象所做的更改是否会传播到另一个模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16937305/

相关文章:

.net - 如何重构/重建以 WinForms 风格开发的 WPF 应用程序

javascript - Bootstrap 模型传递的文本显示为原始文本而不是 html(示例 </br> 显示而不是新行)

javascript - HTML5幻灯片放映效果

javascript - 以html形式划分部分

javascript - 使用带有教科书示例的 node.js 出现意外 token 错误

android - 如何重构具有 3 个相似方法的 onButtonClick?

javascript - 通过ajax传递唯一输入值不起作用

node.js - 如何使用 Node-Express 计算 CSV 文件的行数

node.js - 用 Mongoose 和日期查询

c++ - 关于如何将旧式嵌入式应用程序限制为实时应用程序的建议