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