首页 > 解决方案 > 使用 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 还是我以错误的方式定义了对象。

标签: node.js

解决方案


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,
};

推荐阅读