nodejs中的module.exports – fn vs object

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

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是一个函数,并在被调用时进行评估,这就是为什么它的工作原理,但我不明白为什么打印模块的值始终工作,但引用它之外。 有什么基本的关于如何需要我失踪的作品?

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

是罪魁祸首。

由于JavaScript在JavaScript中的工作原理,该modulevariablesfor循环来说不是本地的for而是整个文件。 因此,当你最后使用它时:

module.exports = apiRegistry;

您正在设置您自己的modulevariables,而不是一个节点的exports属性期望您使用。 更改为使用另一个variables名称可以解决您的问题:

 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;