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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:47:13