Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript nodejs中的module.exports-fn vs object_Javascript_Node.js_Commonjs - Fatal编程技术网

Javascript nodejs中的module.exports-fn vs object

Javascript nodejs中的module.exports-fn vs object,javascript,node.js,commonjs,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('.'

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

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是一个函数,在调用它时对其求值是有意义的,这就是它工作的原因,但我不理解为什么在模块内打印值总是工作的,而在模块外引用则不行。关于require的工作原理,我是否缺少一些基本的东西?

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

是罪魁祸首

由于作用域在JavaScript中的工作方式,该
module
变量不是
for
循环的局部变量,而是整个文件的局部变量。因此,当您在最后使用它时:

module.exports=apiRegistry

您正在自己的
模块
变量上设置
导出
属性,而不是期望您使用的一个节点。更改为使用其他变量名可以解决您的问题:

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;

啊,我早该抓到的。谢谢