Node.js中SQLite查询函数返回undefined问题求助
问题分析与修复方案
你的getSetting函数始终返回undefined,核心问题出在异步逻辑处理不当,还有几个细节问题,以下是具体原因和修复代码:
核心问题
await无法作用于回调式API:sqlite3的db.get是基于回调的方法,并非Promise,await对它无效,getSetting函数会直接执行完毕并返回undefined,不会等待查询结果。- 回调内的
return不影响外层函数:你在db.get的回调里return results.setting_value,这个返回值仅属于回调函数本身,不会被getSetting函数捕获并返回。 - 存在SQL注入风险:用字符串拼接SQL语句(
setting_name="'+setting+'")会引发SQL注入漏洞,必须改用参数化查询。 - 调用异步函数未处理Promise:
getSetting是async函数,直接赋值var test = SQL.getSetting(...)得到的是Promise对象,而非实际查询结果。
修复后的模块函数
var sqlite3 = require('sqlite3').verbose(); const db = new sqlite3.Database('dbex.db'); const fs = require('fs') // 封装Promise版的db.get,适配async/await语法 const dbGet = (sql, params = []) => { return new Promise((resolve, reject) => { db.get(sql, params, (err, row) => { if (err) reject(err); else resolve(row); }); }); }; module.exports = { initDB: () => { let queryInit = fs.readFileSync('db.sql', 'utf8'); db.exec(queryInit); }, sqlite_insert: async (Sqlite_Query) => { // 修正原代码中未定义的queryInit变量,使用传入的参数 db.exec(Sqlite_Query); }, sqlite_query: async (Sqlite_Query, callback = () => {}) => { db.all(Sqlite_Query, function(err,rows){ if(err) return callback(err); return callback(null,rows); }); }, getSetting: async (setting) => { try { // 使用参数化查询避免SQL注入 const result = await dbGet('SELECT * FROM `app_setting` where setting_name = ?', [setting]); console.log(result); if (!result) return null; // 处理找不到对应设置的场景 return result.setting_value; } catch (error) { console.error('查询出错:', error); throw error; // 抛出错误交由调用方处理 } } }
修复后的调用代码
var SQL = require('../services/db/sqlite.js'); document.querySelector('#btnSyncData').addEventListener('click', async () => { // 异步函数需用await获取结果,同时捕获可能的错误 try { var test = await SQL.getSetting('user_branch'); console.log(test); } catch (err) { console.error('获取设置失败:', err); } })
额外说明
- 原模块中
sqlite_insert函数存在变量未定义的问题,已同步修正为使用传入的查询参数。 - 如果需要其他数据库操作(如批量查询、数据修改),可以参照
dbGet的封装方式,将db.all、db.run等回调式API转为Promise,统一用async/await处理,代码逻辑会更简洁易维护。
内容的提问来源于stack exchange,提问作者Mina Ezeet
相关产品推荐
相关产品推荐

