module.exports 返回未定义

module.exports is returning undefined

我目前是 Node 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;
    }
});

如您所见,我正在导出 resObjs 数组,它实际上是一个对象数组,到另一个名为 AppendData.js 的文件如下:

'use strict';
const fs = require('fs');
const getObjs = require('./GetData');

console.log(getObjs.objects);

但是,当我在 Node.js 9.3.0 (ia32) 中 运行 AppendData.js 时,它给出以下 输出 :

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

相反,return 承诺 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
    });
});

注意我添加了错误处理程序。

然后:

'use strict';
const fs = require('fs');
const getObjs = require('./GetData');

getObjs.objectsPromise
    .then(console.log) 
    .catch(error => {
        // Do something
    });

再次注意错误处理程序。

问题的发生是因为 AppendData.js 中的对象在 GetData.js 上加载之前尝试使用它们,因为 fs.createReadStream 是异步的。要解决此问题,只需使 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
        }
    });
}

然后您可以在 AppendData.js:

中像这样使用
'use strict';
const fs = require('fs');
const getObjs = require('./GetData');                 // getObjs is now a function

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