节点模块局部变量不会持久存在

时间:2014-09-08 01:30:26

标签: node.js module

我很困惑。我希望当我加载一个节点模块时,局部变量将在模块中持久存在,但似乎没有发生。

我的节点模块:

var Mailgun = require("mailgun-js");
var api_key, domain;

exports.config = function(config){
    api_key = config.api_key;
    domain = config.domain;
    console.log(config);
};

exports.mailgun = new Mailgun({apiKey: api_key, domain: domain});

然后我像这样使用它:

var mailgunMod = require("./config/mailgun");
var config = {
    api_key: 'key-xxxxxxxxxxxxxxxxxxxxxxxx',
    domain: 'xxxxx.com'
};
mailgunMod.config(config);
var mailgun = mailgunMod.mailgun;
mailgun.messages().send(data, function (err, body) {...};

但是api_key和domain的值都变得不确定。为什么呢?

编辑:尝试过这样的工厂模式:

exports.getMailgun = function(){
    return new Mailgun({apiKey: api_key, domain: domain});
}

效果很好。但是......在做这件事之前我尝试了这个不起作用,我看不出原因:

var Mailgun = require("mailgun-js");
var api_key, domain;
var mailgun;

exports.config = function(config){
    api_key = config.api_key;
    domain = config.domain;
    mailgun = new Mailgun({apiKey: api_key, domain: domain});
    console.log(config);
};

exports.mailgun = mailgun;

现在出口中没有“新”但仍然不起作用(返回.mailgun undefined)。为什么呢?

1 个答案:

答案 0 :(得分:4)

他们没有“变得”未定义,他们开始未定义。

执行第一个模块时(在第二个模块的require()调用期间),传递给mailgun构造函数的值实际上是未定义的。您使用此未定义的值创建一个新的Mailgun实例,然后将其导出。

传递给该构造函数的值从稍后被赋值的变量传递(当你调用config()时)不会改变你创建带有一些undef参数的Mailgun的事实......它永远不会得到重新创建,除非您明确更改它们,否则其初始值不会更改。

您没有将引用(例如,变量)传递给该构造函数,而是传递该值。

也许尝试工厂模式,比如

getMailgun(config){return new Mailgun(config); }

那更干净,因为它不依赖于“模块”作用域变量(实际上,模块不是作用域,而是在包含本地的闭包中执行)