我最初在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语句返回的对象是相同的,我就无法解决这个问题。堆上的对象,当它分别返回到依赖关系图上方的两个不同的其他模块时。任何人都可以向我解释这是否属实,并且理想情况下为我提供正确文档的链接以正确理解行为?
答案 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