我正在编写 nodejs模块,我需要将主文件中的变量数据传递给函数,我这样做:
var region;
var api_key;
exports.region = region;
exports.api_key = api_key;
module.exports = {
getSummonerId: function(sum, callback) {
var summoners = {};
var summoner = sum.replace(/\s+/g, '');
request("https://na.api.pvp.net/api/lol/"+region+"/v1.4/summoner/by-name/"+summoner+"?api_key="+api_key, function(error, response, body) {
summoners[summoner] = JSON.parse(body);
callback(summoners[summoner][summoner].id);
});
}
}
在主文件中:
var lol = require('./apiwrapper.js');
lol.api_key = "example";
lol.region = "las";
lol.getChampions(function(data) {
console.log(data);
})
但是从 apiwrapper.js 那两个变量值总是" 未定义"。
有人能指出我正确的方向吗?
提前致谢。
答案 0 :(得分:11)
导入其他模块的值为module.exports
。因此,您分配给module.exports
的内容将被导出。无论之前分配给它的是什么都丢失了。
module.exports
和exports
之间的关系是它们最初引用同一个对象:
var exports = module.exports = {};
因此,为其中任何一个赋予属性都会改变同一个对象。但是,您要将新对象分配给module.exports
,因此现在它们都引用了不同的对象。
一个简单的解决方案是将新对象分配给exports
,然后分配其他属性:
exports = module.exports = {...};
exports.region = region;
如果要保持语句的顺序,则必须扩展默认的导出对象,而不是创建新的对象:
Object.assign(exports, { ... });
答案 1 :(得分:1)
为什么不使用:
module.exports = {
region: my_region,
api_key: my_api_key,
getSummonerId: function(sum, callback) {
var summoners = {};
var summoner = sum.replace(/\s+/g, '');
request("https://na.api.pvp.net/api/lol/"+region+"/v1.4/summoner/by-name/"+summoner+"?api_key="+api_key, function(error, response, body) {
summoners[summoner] = JSON.parse(body);
callback(summoners[summoner][summoner].id);
});
}
}
在你的情况下," module.exports"覆盖以前导出的变量。这就是你未定义的原因。