我正在尝试使用 Node 读取文件,然后使用我从这些文件中提取的信息创建一个对象。我使用了 fs 和路径库。我在读取文件的代码外部定义了一个空对象,在该代码中(我使用回调的地方(,定义的对象修改了它的值,但在它的值之外的值仍然是空的。有人可以帮助我吗? 这是我的代码:
const path = require("path");
const fs = require("fs");
const dirPath = path.join(__dirname, "query");
let Query = {};
fs.readdir(dirPath, (error, files) => {
if (error) {
return console.log(error);
}
files.forEach((file) => {
const loaded = require(path.join(dirPath, file));
Object.entries(loaded).forEach(([key, value]) => {
Query[key] = value;
});
});
});
module.exports = {
Query,
};
当我在module.exports
上方运行console.log(Query)
时,我得到了{}
答案,但是在从fs.readdir
端返回的回调之前运行相同的内容会返回正确的对象。
我不确定问题是非阻塞IO还是我以错误的方式定义了对象。
fs.readdir
是一个异步函数,这意味着脚本的其余部分将继续运行,而无需等待readdir
中的回调完成。
因此,对象Query
仍将打印{}
- 它尚未更改。
您希望仅在读取文件后继续程序。
执行此操作的一种方法是使用readdirSync
而不是同步函数readdir
。然后,只有完成,程序才会继续。
您使用readdirSync
的代码:
const path = require("path");
const fs = require("fs");
const dirPath = path.join(__dirname, "query");
let Query = {};
fs.readdirSync(dirPath).forEach((file) => {
const loaded = require(path.join(dirPath, file));
Object.entries(loaded).forEach(([key, value]) => {
Query[key] = value;
});
console.log(Query); // Should return the desired object
module.exports = {
Query,
};