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

Node.js中fs.readFile场景下module.exports返回undefined的解决方法

解决Node.js异步读取文件导致导出内容undefined的问题

问题现象

在readCredentials.js中使用fs.readFile异步读取config.json并导出凭证信息,但运行node config.js时,控制台先输出两个undefined,之后才显示正确的username和password值。

核心原因

  • fs.readFile是异步IO操作,它的回调函数要等文件读取完成后才会执行。
  • Node.js的require是同步加载模块的:当config.js加载readCredentials.js时,回调函数还没执行,module.exports还是初始的空状态,所以解构出来的username和password都是undefined。
  • 等文件读取完成、回调执行时,config.js里的console.log早就跑完了,所以会先出现undefined,后显示正确值。

解决方案

方案1:改用同步读取(最适合配置文件场景)

配置文件一般体积很小,用同步读取完全不影响性能,能直接解决异步导致的时序问题。

修改readCredentials.js:

const fs = require("fs");

try {
  // 同步读取文件,指定utf8编码避免处理Buffer
  const data = fs.readFileSync("./config.json", "utf8");
  const config = JSON.parse(data);
  const { username, password } = config;
  
  console.log(username, password);
  module.exports = { username, password };
} catch (err) {
  console.error("读取配置文件失败:", err);
  // 出错时返回默认值避免后续报错
  module.exports = { username: "", password: "" };
}

方案2:Promise+async/await封装异步读取

如果必须用异步(比如处理大文件),可以用Promise封装读取逻辑,再用async/await控制执行顺序。

修改readCredentials.js:

// 使用fs的Promise版本,避免手动封装回调
const fs = require("fs").promises;

async function getCredentials() {
  try {
    const data = await fs.readFile("./config.json", "utf8");
    const { username, password } = JSON.parse(data);
    return { username, password };
  } catch (err) {
    console.error("读取配置文件失败:", err);
    return { username: "", password: "" };
  }
}

module.exports = getCredentials;

修改config.js:

const getCredentials = require("./readCredentials.js");

// 必须在async函数中使用await
async function main() {
  const { username, password } = await getCredentials();
  console.log(username, password);
}

main();

方案3:直接require JSON文件(最简方案)

Node.js原生支持直接requireJSON文件,会自动完成读取和解析,不需要额外写读取逻辑。

删掉readCredentials.js,直接在config.js中:

const { username, password } = require("./config.json");
console.log(username, password);

内容的提问来源于stack exchange,提问作者Didi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:50:45