Javascript module.exports返回未定义

Javascript module.exports返回未定义,javascript,node.js,module,undefined,read-write,Javascript,Node.js,Module,Undefined,Read Write,我目前不熟悉节点JS,今天我试图从文件data.json中读取数据 以下是JSON文件: {"username":"rahul_v7","password":"9673"} {"username":"7vik","password":"3248"} {"username":"pradypot_2","password":"6824"} {"username":"ad_1","password":"9284"} {"username":"premchand_4","password":"4346"

我目前不熟悉
节点JS
,今天我试图从文件
data.json
中读取数据

以下是JSON文件:

{"username":"rahul_v7","password":"9673"} {"username":"7vik","password":"3248"} {"username":"pradypot_2","password":"6824"} {"username":"ad_1","password":"9284"} {"username":"premchand_4","password":"4346"} 
我使用了文件
GetData.js
中的以下代码来读取
data.json
中的数据:

'use strict';
const fs = require('fs');

let res = '', resObjs = [];
let fin = fs.createReadStream('F:/RahulVerma/NodeJS/data.json', 'utf-8');
fin.on('data', data => {
    if(data.length > 0) res += data;
}).on('end', () => {
    if(res.length > 0) {
        let resArr = res.trim().split(' ');

        for(let i = 0; i < resArr.length; i++) {
            resObjs.push(JSON.parse(resArr[i]));
        }

        module.exports.objects = resObjs;
    }
});
但是,当我在
Node.js 9.3.0(ia32)
中运行
AppendData.js
时,它会给出以下输出:


您试图在读取对象之前使用它们。请记住,读取流的代码是异步运行的,并且代码中没有任何内容试图将其与模块加载相协调。因此,
AppendData.js
没有看到导出的
对象,因为它在代码运行时还不存在

相反,返回
AppendData.js
可以使用的对象的承诺;请参见
***
注释:

'use strict';
const fs = require('fs');

// *** Export the promise
module.exports.objectsPromise = new Promise((resolve, reject) => {
    let res = '', resObjs = [];
    let fin = fs.createReadStream('F:/RahulVerma/NodeJS/data.json', 'utf-8');
    fin.on('data', data => {
        if(data.length > 0) res += data;
    }).on('end', () => {
        if(res.length > 0) {
            let resArr = res.trim().split(' ');

            for(let i = 0; i < resArr.length; i++) {
                resObjs.push(JSON.parse(resArr[i]));
            }

            resolve(resObjs); // *** Resolve the promise
        }
    }).on('error', error => {
         reject(error);       // *** Reject the promise
    });
});

再次注意错误处理程序。

发生此问题的原因是,由于
fs.createReadStream
是异步的,因此您试图在将
AppendData.js
中的对象加载到
GetData.js
之前使用这些对象。要解决此问题,只需将
module.exports
设置为一个函数,该函数在
GetData.js
中需要回调,如下所示:

'use strict';
const fs = require('fs');

module.exports = function(callback) {
    let res = '', resObjs = [];
    let fin = fs.createReadStream('F:/RahulVerma/NodeJS/data.json', 'utf-8');
    fin.on('data', data => {
        if(data.length > 0) res += data;
    }).on('end', () => {
        if(res.length > 0) {
            let resArr = res.trim().split(' ');

            for(let i = 0; i < resArr.length; i++) {
                resObjs.push(JSON.parse(resArr[i]));
            }

            callback(resObjs);                        // call the callback with the array of results
        }
    });
}

至少是相关的:@T.J.Crowder,在发布之前我很清楚它可能是重复的,这就是为什么我在Stack Overflow上搜索了大量相关主题的原因。但是,我没能解决这个问题。无论如何,谢谢你的链接:)windows不是用反斜杠导航吗。@ibrahim mahrir,你能解释一下吗?@Rahul我会发布一个支持者的答案。(Doh!如果你看到
.error(error=>{
在答案末尾,点击刷新。愚蠢的打字。)很好,它对我有用!但是,你能给我提供一个相同的回调版本吗?那太棒了!@Rahul-简单回调比承诺更糟糕,尤其是因为承诺可以被多个消费者使用。使用简单回调实际上更复杂。
'use strict';
const fs = require('fs');
const getObjs = require('./GetData');

getObjs.objectsPromise
    .then(console.log) 
    .catch(error => {
        // Do something
    });
'use strict';
const fs = require('fs');

module.exports = function(callback) {
    let res = '', resObjs = [];
    let fin = fs.createReadStream('F:/RahulVerma/NodeJS/data.json', 'utf-8');
    fin.on('data', data => {
        if(data.length > 0) res += data;
    }).on('end', () => {
        if(res.length > 0) {
            let resArr = res.trim().split(' ');

            for(let i = 0; i < resArr.length; i++) {
                resObjs.push(JSON.parse(resArr[i]));
            }

            callback(resObjs);                        // call the callback with the array of results
        }
    });
}
'use strict';
const fs = require('fs');
const getObjs = require('./GetData');                 // getObjs is now a function

getObjs(function(objects) {
    console.log(objects);
});