module.exports возвращает неопределенное значение - PullRequest
0 голосов
/ 20 мая 2018

В настоящее время я новичок в 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);

Но когдаЯ запускаю AppendData.js в Node.js 9.3.0 (ia32), он дает следующий вывод :

Output Image

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Проблема возникает из-за того, что вы пытаетесь использовать объекты в 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);
});
0 голосов
/ 20 мая 2018

Вы пытаетесь использовать объекты до того, как они будут прочитаны.Помните, что ваш код, читающий поток, выполняется асинхронно , и ничто в вашем коде не пытается согласовать его с загрузкой модуля.Так что AppendData.js не видит экспорт objects, потому что он еще не существует на момент запуска этого кода.

Вместо этого верните обещание объектов, которые 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
    });

Снова обратите внимание на обработчик ошибок.

...