我有一个初始化的对象,我在app.js文件中初始化,我想让这个初始化对象在所有模块中都可用。我怎么能这样做?将这个对象传递给每个模块是一种方法,我想知道我是否缺少任何东西,或者应该以不同的方式完成这些工作?
我看到mongoose实际上支持默认连接,我需要在app.js中初始化一次和其他模块中的任何地方,我可以简单地使用它而不需要传递它。有没有我可以这样做?
我还检查了node.js http://nodejs.org/api/globals.html的全局对象文档,并想知道我应该使用global来解决问题。
由于
答案 0 :(得分:10)
一点建议:
以下是如何使用单例进行日志记录的示例:
LIB / logger.js
var bunyan = require('bunyan'),
mixIn = require('mout/object/mixIn'),
// add some default options here...
defaults = {},
// singleton
logger,
createLogger = function createLogger(options) {
var opts;
if (logger) {
return logger;
}
opts = mixIn({}, defaults, options);
logger = bunyan.createLogger(opts);
return logger;
};
module.exports = createLogger;
LIB / module.js
var logger = require('./logger.js'),
log = logger();
log.info('Something happened.');
希望有所帮助。
答案 1 :(得分:4)
正如您所建议的那样,解决方案是将对象作为属性添加到全局对象。但是,我建议不要这样做,并将对象放在自己的模块中,require
d来自需要它的每个其他模块。您将在以后以多种方式获益。首先,它始终是显式对象来自何处以及初始化的位置。在初始化之前,您将永远不会尝试使用该对象(假设定义它的模块也初始化它)。此外,这将有助于使您的代码更易于测试,
答案 2 :(得分:0)
问题有多种解决方案,取决于您的应用程序的大小。你提到的两个解决方案是最明显的解决方案。我宁愿选择第三个基于重新构建代码的方法。我提供的解决方案看起来很像执行器模式。
首先创建需要您使用此特定形式的公共模块的操作 -
var Action_One = function(commonItems) {
this.commonItems = commonItems;
};
Action_One.prototype.execute = function() {
//..blah blah
//Your action specific code
};
var Action_Two = function(commonItems) {
this.commonItems = commonItems;
};
Action_Two.prototype.execute = function() {
//..blah blah
//Your action_two specific code
};
现在创建一个动作初始化程序,它将以编程方式初始化您的动作 -
var ActionInitializer = function(commonItems) {
this.commonItems = commonItems;
};
ActionInitializer.prototype.init = function(Action) {
var obj = new Action(this.commonItems);
return obj;
};
下一步是创建一个动作执行器 -
//You can create a more complex executor using `Async` lib or something else
var Executor = function(ActionInitializer, commonItems) {
this.initializer = new ActionInitializer(commonItems);
this.actions = [];
};
//Use this to add an action to the executor
Executor.prototype.add = function(action) {
var result = this.initializer.init(action);
this.actions.push(result);
};
//Executes all the actions
Executor.prototype.executeAll = function() {
var result = [];
for (var i = this.action.length - 1; i >= 0; i--) {
result[i] = this.action[i].execute();
}
this.action = []
return result;
};
我们的想法是将每个模块解耦,以便在这种情况下只有一个模块Executor
,这取决于公共属性。现在让我们看看它是如何工作的 -
var commonProperties = {a:1, b:2};
//Pass the action initilizer class and the common property object to just this one module
var e = new Executor(ActionInitializer, commonProperties);
e.add(Action_One);
e.add(Action_Two);
e.executeAll();
console.log(e.results);
这样您的程序将更清晰,更具可扩展性。如果不清楚则拍摄问题。快乐的编码!