NodeJS读取多个JSON文件:数据导出及异步问题求助
问题分析与解决方案
你的代码里有几个核心问题导致数据无法正确导出和获取:
forEach不支持异步等待:await对forEach完全无效,循环里的文件读取操作还没完成,后续代码就已经执行,导致dosya.bilgi根本没被正确填充。- 回调版
fs.readFile无法直接赋值:回调模式的fs.readFile没有返回有效内容,直接把它赋值给dosya.bilgi只能拿到undefined。 - 异步操作未完成时外部拿不到数据:
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
相关产品推荐
相关产品推荐

