SQLite查询无结果时如何通过Promise返回错误给用户?
解决SQLite查询无结果时Promise无返回的问题
首先咱们得揪出你代码里的问题根源:你用了db.each()方法,但这个方法的设计逻辑是遍历查询到的每一行数据——如果查询结果为空,它根本不会触发你传入的回调函数。这就导致你的Promise既不会resolve也不会reject,一直处于pending状态,自然就出现了“耗时久且无返回”的情况。
方案一:改用db.get()方法(推荐)
你的需求是判断用户名是否存在,本质是查询单条数据,SQLite的get()方法就是专门用来获取单条结果的,完美匹配你的场景。当有匹配结果时它会返回对应行,没有结果时会返回undefined,而且不管有没有结果,都会触发回调,这样Promise就能正常流转了。
修改后的代码如下:
selectOne(query) { return new Promise((resolve, reject) => { this.db.get(query, (err, row) => { if (err) { reject(err); } else { // 无匹配结果时row为undefined,直接resolve出去供上层判断 resolve(row); } }); }); }
使用时可以这样判断用户名状态:
async function checkUsername(username) { try { const user = await selectOne(`SELECT username FROM user WHERE username='${username}'`); if (user) { console.log("用户名已存在,无法注册"); return false; } else { console.log("用户名可用,允许注册"); return true; } } catch (err) { console.error("查询出错:", err); throw err; } }
方案二:给each()添加complete回调(仅适合必须用each的场景)
如果你一定要保留each()写法,可以利用它的第三个参数——complete回调,这个回调会在遍历完成(包括没有任何行需要遍历的情况)时触发。我们可以用变量标记是否找到结果,在complete里处理无结果的情况:
selectOne(query) { return new Promise((resolve, reject) => { let foundRow = null; this.db.each(query, (err, row) => { if (err) { reject(err); } foundRow = row; }, (err, count) => { // count是查询到的总行数 if (err) { reject(err); } else if (count === 0) { // 无匹配结果,可根据需求选择resolve(null)或reject自定义错误 resolve(null); // 若希望无结果时返回错误:reject(new Error("未找到匹配的用户名")); } else { resolve(foundRow); } }); }); }
额外提醒:避免SQL注入风险
直接把用户输入拼进SQL语句存在安全隐患,建议用参数化查询:
// 用?作为占位符传递参数 const user = await selectOne(`SELECT username FROM user WHERE username=?`, [username]);
同时修改selectOne方法支持参数:
selectOne(query, params = []) { return new Promise((resolve, reject) => { this.db.get(query, params, (err, row) => { if (err) reject(err); resolve(row); }); }); }
内容的提问来源于stack exchange,提问作者Md Misbauddin Chowdhury
相关产品推荐
相关产品推荐

