module.exports返回undefined

时间:2018-05-20 17:04:28

标签: javascript node.js module undefined read-write

我目前刚接触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;
    }
});

如您所见,我将<{1}}数组(实际上是对象数组)导出到另一个名为{{1}的文件},如下所示:

resObjs

但是,当我在AppendData.js中运行'use strict'; const fs = require('fs'); const getObjs = require('./GetData'); console.log(getObjs.objects); 时,它会提供以下输出

Output Image

2 个答案:

答案 0 :(得分:1)

您尝试在阅读之前使用这些对象。请记住,读取流的代码以异步方式运行 ,代码中的任何内容都不会尝试将其与模块加载进行协调。因此AppendData.js没有看到objects导出,因为它在代码运行时尚不存在。

相反,返回AppendData.js可以使用的对象的 promise ;见***评论:

'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
    });

再次注意错误处理程序。

答案 1 :(得分:0)

问题发生的原因是,由于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);
});