我目前刚接触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);
时,它会提供以下输出:
答案 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);
});