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
相关产品推荐
相关产品推荐

