我使用fs.readFile
读取readCredentials.js
中config.json
的内容。然后我导出函数,以便我可以在config.js
中使用它。
当我运行node config.js
时,我得到两个undefined
,然后在config.js
中得到username
和password
的实值。知道我该怎么解决吗?
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 };