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

NodeJS环境中SQLite3查询结果返回undefined问题求助

问题根因
  • sqlite3 原生的db.get()是回调风格API,本身不返回Promise,代码中直接加await不会生效,getSql函数不等回调执行完成就会默认返回undefined,这是拿到空值的核心原因。
  • 回调函数内部的return语句仅作用于回调函数本身,返回值无法传递到外层的getSql函数。
  • 从输出日志的顺序可以验证异步执行逻辑异常:先打印了undefined SECOND,之后才触发数据库连接成功、查询完成的回调,完全没有按照预期的顺序执行。
修复方案

核心逻辑是把回调式的数据库查询封装为Promise,才能通过async/await正确控制异步执行顺序、拿到返回值。
修复后的完整代码如下:

const sqlite3 = require('sqlite3').verbose();
// 替换为你自己的数据库文件路径
const HISTORY_DB = './history.db'

const db_client = new sqlite3.Database(HISTORY_DB, (err) => {
  if (err) {
    console.error(err.message, '## ERROR ##');
    return;
  }
  console.log('Connected to the SQlite DB');
});

const current_hour = new Date().getHours();
// 使用?占位符传参,避免SQL注入风险
const sql = `SELECT value FROM history where hour = ?`;

// 封装为返回Promise的查询方法
const getSql = (sql, params = []) => {
  return new Promise((resolve, reject) => {
    db_client.get(sql, params, (err, row) => {
      if (err) {
        console.error(err.message);
        return reject(err);
      }
      console.log(row?.value, 'FIRST');
      // 查询结果存在则返回转成数字的值,不存在返回null
      resolve(row ? parseInt(row.value) : null);
    })
  })
};

// 顶层异步调用用自执行async函数包裹,Node.js ES模块可直接使用顶层await
(async () => {
  try {
    const queryResult = await getSql(sql, [current_hour]);
    console.log(queryResult, 'SECOND');
  } catch (err) {
    console.error('查询执行失败:', err);
  }
})()
额外注意事项
  • 不要直接在SQL字符串中拼接变量,使用?占位符传参可以避免SQL注入风险
  • 所有sqlite3的回调API都可以用同样的Promise封装方式适配async/await语法

内容的提问来源于stack exchange,提问作者shonster88

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:54:07