Node.js 使用节点读取文件将返回读取代码之外的空对象

Node.js 使用节点读取文件将返回读取代码之外的空对象,node.js,Node.js,我正在尝试使用节点读取文件,然后使用从这些文件中提取的信息创建一个对象。我使用了fs和path libs。我在读取文件的代码外部定义了一个空对象,在该代码内部(我使用回调),定义的对象得到修改的值,但在其值外部保持为空。有人能帮我吗? 这是我的密码: const path = require("path"); const fs = require("fs"); const dirPath = path.join(__dirname, "quer

我正在尝试使用节点读取文件,然后使用从这些文件中提取的信息创建一个对象。我使用了fs和path libs。我在读取文件的代码外部定义了一个空对象,在该代码内部(我使用回调),定义的对象得到修改的值,但在其值外部保持为空。有人能帮我吗? 这是我的密码:

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,
};
当我在
模块.exports上运行
console.log(Query)
时,我得到了
{}
作为答案,但是在从
fs.readdir
结束的回调之前运行相同的命令会返回正确的对象


我不确定问题是非阻塞IO还是我定义对象的方式错误。

fs.readdir
是一个异步函数,这意味着脚本的其余部分将继续运行,而不等待
readdir
中的回调完成

因此,对象
查询
仍将打印
{}
——它尚未更改

您只想在读取文件后继续程序

一种方法是使用
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,
};