You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:13:19