node.sports in nodejs - fn vs object

时间:2013-06-20 05:37:27

标签: javascript node.js commonjs

我试图理解以下两个我认为是相同功能的替代表示之间的区别。

apiRegistry1.js

module.exports = function () {
    var apiRegistry = {};
    var files = fs.readdirSync('./apis');
    for (var index in files) {
        var fileName = files[index];
        var module = fileName.split('.')[0];
        apiRegistry[module] = require('../apis/' + module);
    }
    // console.log(apiRegistry) --> Prints {key: moduledef ..}
    return apiRegistry;
};

VS

apiregistry2.js

var apiRegistry = {};
var files = fs.readdirSync('./apis');
for (var index in files) {
    var fileName = files[index];
    var module = fileName.split('.')[0];
    apiRegistry[module] = require('../apis/' + module);
}

// console.log(apiRegistry) --> Prints {key: moduledef ..}
module.exports = apiRegistry;

server.js

var apiRegistry1 = require('./includes/apiregistry1')(); // returns {key: moduledef ..}
var apiRegistry2 = require('./includes/apiregistry2'); //returns {}

apiRegistry1表现得像我预期的那样,但是2没有。在某种程度上,1是一个函数并且在被调用时进行评估是有道理的,这就是它工作的原因,但我不明白为什么在模块中打印值总是有效,但是在它没有。关于如何要求我缺少的作品有什么基础吗?

1 个答案:

答案 0 :(得分:3)

var module = fileName.split('.')[0];

是罪魁祸首。

由于JavaScript中的作用域如何工作,module变量不是for循环的本地变量,而是整个文件。因此,当你最后使用它时:

module.exports = apiRegistry;

您在自己的exports变量上设置module属性,而不是您希望使用的一个节点。更改为使用其他变量名称可以解决您的问题:

var apiRegistry = {};
var files = fs.readdirSync('./apis');
for (var index in files) {
    var fileName = files[index];
    var myModule = fileName.split('.')[0];
    apiRegistry[myModule] = require('../apis/' + myModule);
}

// console.log(apiRegistry) --> Prints {key: moduledef ..}
module.exports = apiRegistry;