1

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

一个网络爬虫构造器,它使用 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 对象。我需要做的是让网络爬虫模块对其数据存储对象所做的任何更改都复制到网络服务器模块可用的数据存储对象版本中。

我已经尝试查看所有 nodejs 文档,并且还进行了很多谷歌搜索,但是如果 commonjs 模块的 export 语句返回的对象与当它分别返回到依赖关系图更高的两个不同的其他模块时,堆。如果这是真的,任何人都可以向我解释,并理想地为我提供正确文档的链接以正确理解行为吗?

4

1 回答 1

1

here is the way I do it:

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);
}

the second function is accessor functions to my database. Not sure that this is the best way, but lets me swap out different databases easily if I need to and should save any changes to the datastore object. Instead of requiring it more than one module, pass the single object around

Here is a more complete example with several databases for an account manager module I wrote:

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

于 2013-06-05T12:15:19.703 回答