推荐将配置传递给模块的方法

时间:2013-08-12 12:26:20

标签: node.js design-patterns

将设置变量传递给node.js模块的推荐方法是什么? 目前我正在使用以下设计,需要在module.exports函数中放置require调用。这样做是为了避免在任何地方使用var config = require('./myConfig'),因为这个想法是在app入口点(也就是app.js,server.js ......)中要求配置一次

// A module that needs configuration settings when required.

// Some requires here...
var sample_module1 = require('amodule');
var sample_module2 = require('another_module');


module.exports = function(config) {

var apiKey = config.apiKey; // Get api key from configuration.

// This require must be here because needs 'config' variable...
var apiCaller = require('../lib/api_caller.js')(apiKey);


// An exported function that also uses configuration settings.
exports.makeCall = function(callback) {

  // Get some settings from configuration.
  var text = config.welcomeText; 
  var appName = config.appName; 

  // Use apiCaller module...
  apiCaller.send(appName, text, function(e){
    if (e) { return callback(e); }
    return callback(null);
  });
}

...

return exports;
}

我想知道是否有更好的替代品来使用'../lib/api_caller.js'模块(通过重构等)

1 个答案:

答案 0 :(得分:1)

一种解决方案可能是使用nconf之类的东西,并依赖它来在正确的时间加载正确的文件。特别是在您的情况下,我将使用conf配置文件在项目的根目录中创建一个default.json文件夹。然后,您可以创建利用configuration.js和新创建的文件的全局nconf

var nconf = require("nconf")
  , path = require("path")
  , environment;

nconf.argv().env("_");

environment = nconf.get("NODE:ENV") || "development";

nconf.file("default", path.resolve("config/default.json"));

module.exports = nconf.get

从需要某些配置的其他模块中,您只需使用:

var conf = require('configuration.js')
conf('NODE_ENV') // print NODE_ENV

但听起来它与你不想要的东西非常相似。另一种选择是使用类似构造函数的东西:

var ApiCaller = require('../lib/api_caller.js');
var apiCaller = new ApiCaller({ some: 'parameter' });
apiCaller.doSomething();

“class”ApiCaller的样子:

function ApiCaller(options){
  this.options = options;
}

Api.prototype.something = function(){
  this.options //my options
};