Node.js中module.exports返回undefined问题求助
解决Node.js中异步读取文件后导出数据为undefined的问题
嘿,我来帮你搞定这个问题!你遇到的undefined问题本质是异步操作的时机没把握好,咱们一步步拆解来看:
问题根源
fs.createReadStream是异步操作——它会在后台读取文件,等读完了才触发end回调去解析数据、给module.exports.objects赋值。但AppendData.js里的require('./GetData')是同步执行的,这时候文件还没读完,module.exports.objects还没被赋值,自然打印出来是undefined。
解决方案
我们需要把异步操作的结果正确传递出去,这里给你两种常用的实现方式:
方式1:使用回调函数(基础异步写法)
修改GetData.js,不直接导出数据,而是提供一个回调函数,等数据准备好后再调用回调返回结果:
'use strict'; const fs = require('fs'); // 导出一个接收回调的函数 module.exports = function getData(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) { try { let resArr = res.trim().split(' '); for(let i = 0; i < resArr.length; i++) { resObjs.push(JSON.parse(resArr[i])); } callback(null, resObjs); // 成功时传递数据 } catch (parseErr) { callback(parseErr, null); // 捕获JSON解析错误 } } else { callback(new Error('文件中无有效数据'), null); } }).on('error', (err) => { callback(err, null); // 捕获文件读取错误 }); };
然后修改AppendData.js,通过回调获取数据:
'use strict'; const getData = require('./GetData'); getData((err, objects) => { if(err) { console.error('读取数据出错:', err); return; } console.log(objects); });
方式2:使用Promise + async/await(更现代化的写法)
用Promise封装异步读取逻辑,再配合async/await让代码更像同步写法:
修改GetData.js:
'use strict'; const fs = require('fs'); // 导出一个返回Promise的函数 module.exports = function getData() { return 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) { try { let resArr = res.trim().split(' '); resArr.forEach(item => { resObjs.push(JSON.parse(item)); }); resolve(resObjs); // 成功时resolve数据 } catch (parseErr) { reject(new Error(`JSON解析失败: ${parseErr.message}`)); } } else { reject(new Error('文件中无有效数据')); } }).on('error', (err) => { reject(new Error(`文件读取失败: ${err.message}`)); }); }); };
修改AppendData.js:
'use strict'; const getData = require('./GetData'); // 用async/await处理Promise async function loadAndPrintData() { try { const objects = await getData(); console.log(objects); } catch (err) { console.error('出错了:', err); } } loadAndPrintData();
额外建议:修复data.json的格式问题
你当前的data.json不是标准JSON格式(多个对象用空格分隔),如果某个对象里出现空格,split(' ')就会出错。建议改成标准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"}]
这样读取后直接JSON.parse(res)就能得到数组,不需要split,更安全可靠。
内容的提问来源于stack exchange,提问作者user9090230
相关产品推荐
相关产品推荐

