Node.js中SQLite3异步查询返回空数组的问题求解
解决SQLite3异步操作导致返回空数组的问题
你遇到的核心问题是**db.each是异步执行的**,你的getNewOrders函数在数据库查询还没完成、数据还没填充到orders数组的时候,就已经把空数组返回了——这就是为什么控制台先打印[],之后才出现数据库连接提示和1的原因。
下面给你两种主流的修改方案,选一种适合你的就行:
方案一:用Promise + Async/Await(推荐)
这种方式代码更清晰,符合现代JS的异步编程习惯,可读性更强。
首先修改db.js里的getNewOrders,把它封装成返回Promise的函数:
// db.js const sqlite3 = require("sqlite3").verbose(); let db = new sqlite3.Database(process.env.DB_PATH, err => { if (err) { console.error(err.message); } console.log("Connected to the test database."); }); db.run( .... ); function getNewOrders() { return new Promise((resolve, reject) => { const orders = []; // db.each的第三个参数是所有行处理完成后的回调 db.each( "SELECT * FROM Orders", (err, row) => { if (err) { return reject(err); // 遇到错误就拒绝Promise } orders.push(row); console.log(1); }, (err, count) => { if (err) { reject(err); } else { console.log(`共获取到 ${count} 条订单数据`); resolve(orders); // 数据全部处理完,返回结果数组 } } ); }); } module.exports.getNewOrders = getNewOrders;
然后修改order.js,用async/await来等待异步操作完成:
// order.js const db = require("./db"); // 用async函数包裹异步操作 async function fetchOrders() { try { const orders = await db.getNewOrders(); console.log(orders); // 现在这里打印的就是完整的订单数据了 } catch (err) { console.error("获取订单失败:", err.message); } } // 调用这个async函数 fetchOrders();
方案二:用传统回调函数
如果你习惯用回调的方式处理异步,也可以这样改:
修改db.js的getNewOrders,让它接受一个回调参数:
// db.js function getNewOrders(callback) { const orders = []; db.each( "SELECT * FROM Orders", (err, row) => { if (err) { return callback(err); } orders.push(row); console.log(1); }, (err, count) => { if (err) { callback(err); } else { callback(null, orders); // 第一个参数是错误(null表示无错),第二个是结果 } } ); } module.exports.getNewOrders = getNewOrders;
然后在order.js里通过回调获取结果:
// order.js const db = require("./db"); db.getNewOrders((err, orders) => { if (err) { console.error("出错了:", err.message); return; } console.log(orders); // 这里能拿到完整的订单数据 });
关键说明
db.each是异步方法,它不会阻塞代码执行,所以你的同步返回逻辑肯定拿不到数据。必须等到它的完成回调触发后,才能确定数据已经全部收集完毕。- 两种方案里都用到了
db.each的第三个参数——这个回调会在所有行都处理完成后触发,这是确保数据完整的关键。
内容的提问来源于stack exchange,提问作者Hassan
相关产品推荐
相关产品推荐

