Node.js使所有模块中的初始化对象可用

时间:2013-09-06 03:19:30

标签: javascript node.js

我有一个初始化的对象,我在app.js文件中初始化,我想让这个初始化对象在所有模块中都可用。我怎么能这样做?将这个对象传递给每个模块是一种方法,我想知道我是否缺少任何东西,或者应该以不同的方式完成这些工作?

我看到mongoose实际上支持默认连接,我需要在app.js中初始化一次和其他模块中的任何地方,我可以简单地使用它而不需要传递它。有没有我可以这样做?

我还检查了node.js http://nodejs.org/api/globals.html的全局对象文档,并想知道我应该使用global来解决问题。

由于

3 个答案:

答案 0 :(得分:10)

一点建议:

  • 您应该很少需要使用全局。如果您认为自己需要,可能不会。
  • Singletons通常是Node.js中的反模式,但有时(日志记录,配置)他们将完成工作。
  • 传递某些东西有时是一种有用且有价值的模式。

以下是如何使用单例进行日志记录的示例:

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

这样您的程序将更清晰,更具可扩展性。如果不清楚则拍摄问题。快乐的编码!