Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果一个nodejs模块将一个对象导出到另外两个模块,那么在一个下游模块中对该对象所做的更改是否会传播到另一个模块?_Javascript_Node.js_Refactoring_Commonjs - Fatal编程技术网

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

Javascript 如果一个nodejs模块将一个对象导出到另外两个模块,那么在一个下游模块中对该对象所做的更改是否会传播到另一个模块?,javascript,node.js,refactoring,commonjs,Javascript,Node.js,Refactoring,Commonjs,我最初在nodejs中有一个工作应用程序,它的所有代码都在一个文件中,使用构造函数和iife将其分割成离散的块。为了提供合理的解耦和分离,我一直在尝试重构程序,使每个块都位于不同的文件中,但我遇到了一个问题 该计划分为三个核心部分: 初始化以连接到Redis并返回Redis客户端和数据存储对象的数据存储构造函数 function CreateDataStore(storePort, storeUrl, passwd) { var client , datastore;

我最初在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;
function CreateWebCrawler(){
    //do some stuff
    //initialise robots.txt parser

    return function() {
    //crawl a page
    //add page data to testResults object
    }
}
使用redis客户端并将数据存储在数据存储对象中的web爬虫构造函数

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;
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爬虫模块对其数据存储对象所做的任何更改都要复制到web服务器模块可用的数据存储对象版本中


我试着浏览了所有的nodejs文档,也做了大量的谷歌搜索,但我一辈子都无法确定commonjs模块的export语句返回的对象是否是堆上的同一个对象,当它分别返回到依赖关系图上方的两个不同模块时。有没有人能向我解释一下这是否属实,最好能为我提供一个正确文档的链接,以便正确理解行为?

以下是我的做法:

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);
}
第二个函数是数据库的访问器函数。不确定这是否是最好的方法,但如果需要并且应该保存对数据存储对象的任何更改,我可以轻松地交换不同的数据库。与其要求它有多个模块,不如传递单个对象

下面是一个更完整的示例,其中包含我编写的account manager模块的多个数据库:


以下是我的做法:

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);
}
第二个函数是数据库的访问器函数。不确定这是否是最好的方法,但如果需要并且应该保存对数据存储对象的任何更改,我可以轻松地交换不同的数据库。与其要求它有多个模块,不如传递单个对象

下面是一个更完整的示例,其中包含我编写的account manager模块的多个数据库:


我想说清楚,您建议在程序的顶层使用数据存储模块,然后将该模块返回的数据存储对象作为显式参数传递给所有其他模块,这些模块需要将其作为自己的require表达式的一部分?我已经实现了上述内容,将数据存储对象作为参数传递给每个需要它的函数。它感觉有点凌乱和粗糙,特别是当我将对象传递到调用堆栈的三层时,中间两层不使用它,但底层使用它。不管它是怎么工作的。是的,我很高兴它有帮助。我胡思乱想了一些其他的方法来做这件事。花了一点时间来适应它,但您可以重新构建代码,使其更干净。修改传入的对象不会传播到根对象。如果您需要这些更改,请使用api进行沟通。另外,请阅读这些更改的公认答案:这两个答案都是清晰明了的。Dominic是一个JS专家只是想说清楚,你建议在程序的顶层需要数据存储模块,然后将该模块返回的数据存储对象作为显式参数传递给所有其他需要它的模块,作为它们自己的require表达式的一部分?我已经实现了上述内容,将数据存储对象作为参数传递给每个需要它的函数。它感觉有点凌乱和粗糙,特别是当我将对象传递到调用堆栈的三层时,中间两层不使用它,但底层使用它。不管它是怎么工作的。是的,我很高兴它有帮助。我胡思乱想了一些其他的方法来做这件事。花了一点时间来适应它,但您可以重新构建代码,使其更干净。修改传入的对象不会传播到根对象。如果您需要这些更改,请使用api进行沟通。另外,请阅读这些更改的公认答案:这两个答案都是清晰明了的。多米尼克是JS大师