NodeJS循环中异步函数仅执行一次问题排查
问题分析与修复方案
问题根源
- 数据库驱动被提前关闭:
writeToDB函数的finally块中,每次执行都会调用await driver.close(),第一次写入完成后数据库驱动就被关闭,后续的查询请求因驱动已关闭无法执行,导致仅第一个元素写入成功。 - 原代码存在两处笔误:
test.js中console.log(data.length)应为console.log(data_list.length);db.js中console.log(data.length)接收的是单个元素,此处打印length无意义,应改为打印单个数据内容。
修复步骤
1. 调整db.js:将驱动关闭逻辑移到外部控制
移除每次写入后的驱动关闭,新增独立的驱动关闭方法,让所有写入操作完成后统一关闭:
// db.js async function writeToDB(data){ console.log(data); // 打印单个数据元素,替代原错误的data.length const query_str = "..."; try{ const response = await driver.executeQuery(query_str, ...); return !!response; // 简化判断,直接返回布尔值 } catch(err){ console.log('Error in query: '+ err); return false; // 异常时返回false } } // 新增驱动关闭方法,供外部统一调用 async function closeDriver() { await driver.close(); } exports.writeToDB = writeToDB; exports.closeDriver = closeDriver;
2. 修正test.js:正确处理异步遍历并统一关闭驱动
根据业务需求选择串行或并行执行方式:
方式一:串行执行(适合需要保证写入顺序的场景)
// test.js const source = require("./source") const db = require("./db") source.loadFromFile() .then(async data_list => { console.log(data_list.length); // 修正笔误,打印列表长度 // 依次执行每个写入操作 for (const json_data of data_list){ const resp = await db.writeToDB(json_data); console.log(resp); } // 所有写入完成后关闭驱动 await db.closeDriver(); }) .catch(error => console.error(error));
方式二:并行执行(适合无顺序要求、追求效率的场景)
// test.js const source = require("./source") const db = require("./db") source.loadFromFile() .then(async data_list => { console.log(data_list.length); // 修正笔误,打印列表长度 // 生成所有写入操作的Promise const writePromises = data_list.map(json_data => db.writeToDB(json_data).then(resp => { console.log(resp); return resp; }) ); // 等待所有写入操作完成 await Promise.all(writePromises); // 统一关闭驱动 await db.closeDriver(); }) .catch(error => console.error(error));
额外注意事项
- 确保数据库驱动
driver是全局初始化的单例,避免每次写入都重新创建连接,造成资源浪费。
内容的提问来源于stack exchange,提问作者F Baig
相关产品推荐
相关产品推荐

