模块.exports在Node JS中返回undefined



我使用fs.readFile读取readCredentials.jsconfig.json的内容。然后我导出函数,以便我可以在config.js中使用它。

当我运行node config.js时,我得到两个undefined,然后在config.js中得到usernamepassword的实值。知道我该怎么解决吗?

readCredentials.js

const fs = require("fs");
fs.readFile("./config.json", (err, data) => {
if (err) {
console.log(err);
}
const config = JSON.parse(data);
const username = config.username;
const password = config.password;
console.log(username, password);
module.exports = { username, password };
});

json

{"username"xyz"password"xyz"}

config.js

const { username, password } = require("./readCredentials.js");
const usernameValue = username;
const passwordValue = password;
console.log(usernameValue, passwordValue);

在CommonJS模块中,您不能将module.exports分配为任何异步操作的结果。这是因为整个加载过程不会等待异步操作完成。

因此,该导出的消费者将在异步操作分配它之前使用它的值。

在ESM模块和最新版本的nodejs中,你可以使用use顶级await和承诺来完成这样的事情。

但是,因为这只是模块加载过程的一部分,你可以使用fs.readFileSync()切换到同步I/O,或者只使用require(),它可以自动加载和解析.json文件,并以这种方式解决你的问题。

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

最简单的方法是使用普通的require代替(它可以读取和解析json文件)。另一种选择是readFileSync,如上所述。

readCredentials.js

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

最新更新