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