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
相关产品推荐
相关产品推荐

