node.js - 使用 Node 读取文件在读取代码之外返回空对象
问题描述
我正在尝试使用 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,
};
当我在console.log(Query)
上面运行时,module.exports
我得到了{}
答案,但是在结束回调之前运行相同的方法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,
};
推荐阅读
- python - 使用 Seaborn 绘制嵌套的多箱图
- reactjs - 使用带有嵌套 MenuItem 的 Material Ui 的 Redux Form 不起作用
- java - 加载 youtube 视频时出错:未知的 youtube 活动
- postgresql - 查询以检查凭据是否已存在的正确方法
- python - 图像 + 浮点数组作为 Keras 模型中的输入
- reactjs - React Hook - tsx 和无类型数组
- python - 实例化自定义结构化 dtype 的标量
- python - AttributeError:“NoneType”对象没有属性“conId”
- python - Python Django 文件字段 404
- typescript - 在 Visual Studio Code Extension API 中是否有在运行时获取 OS 平台的 API?