You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS读取多个JSON文件:数据导出及异步问题求助

问题分析与解决方案

你的代码里有几个核心问题导致数据无法正确导出和获取:

  1. forEach不支持异步等待:await对forEach完全无效,循环里的文件读取操作还没完成,后续代码就已经执行,导致dosya.bilgi根本没被正确填充。
  2. 回调版fs.readFile无法直接赋值:回调模式的fs.readFile没有返回有效内容,直接把它赋值给dosya.bilgi只能拿到undefined。
  3. 异步操作未完成时外部拿不到数据:fs.readdir是异步函数,外部访问dosya时,回调里的逻辑可能还没执行,拿到的只是初始的空对象。

修正后的代码示例

改用fs.promises异步API,配合Promise.all并行处理文件,同时导出异步函数让外部获取最终数据:

const fs = require('fs').promises;
const path = require('path');

// 封装读取文件夹数据的异步函数
async function loadDosyaData() {
  const folderPath = './bilgiler/kisi-bilgiler/';
  const files = await fs.readdir(folderPath);
  
  // 并行读取并解析所有JSON文件
  const bilgi = await Promise.all(
    files.map(async (file) => {
      const filePath = path.join(folderPath, file);
      const content = await fs.readFile(filePath, 'utf8');
      return JSON.parse(content); // 解析JSON内容
    })
  );

  return {
    bilgi,
    sayi: files.length
  };
}

// 导出异步函数,外部通过await获取数据
module.exports = loadDosyaData;

外部调用示例

在其他文件中这样使用:

const loadDosyaData = require('./你的主文件名');

async function main() {
  const dosya = await loadDosyaData();
  console.log('文件数量:', dosya.sayi);
  console.log('所有数据:', dosya.bilgi);
  // 这里可以用dosya数据做查询操作
}

main();

关键说明

  • 用fs.promises替代回调版API,避免回调嵌套,同时能配合async/await精准控制异步流程。
  • Promise.all让所有文件读取操作并行执行,比逐个等待效率更高。
  • 不能直接导出同步变量,因为数据是异步获取的,导出异步函数可以让外部主动等待数据准备完成。

内容的提问来源于stack exchange,提问作者Thesselia's

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 14:15:06