我很困惑。我希望当我加载一个节点模块时,局部变量将在模块中持久存在,但似乎没有发生。
我的节点模块:
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)。为什么呢?
答案 0 :(得分:4)
他们没有“变得”未定义,他们开始未定义。
执行第一个模块时(在第二个模块的require()调用期间),传递给mailgun构造函数的值实际上是未定义的。您使用此未定义的值创建一个新的Mailgun实例,然后将其导出。
传递给该构造函数的值从稍后被赋值的变量传递(当你调用config()时)不会改变你创建带有一些undef参数的Mailgun的事实......它永远不会得到重新创建,除非您明确更改它们,否则其初始值不会更改。
您没有将引用(例如,变量)传递给该构造函数,而是传递该值。
也许尝试工厂模式,比如
getMailgun(config){return new Mailgun(config); }
那更干净,因为它不依赖于“模块”作用域变量(实际上,模块不是作用域,而是在包含本地的闭包中执行)