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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:06:12