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

await执行MySQL查询返回空时如何避免报错并返回0或null?

解决方案

错误来源于两个可能场景:

  • sessions表无匹配记录时,doquery方法直接返回rejected状态的Promise没有被捕获
  • 即使doquery不抛出reject,返回空数组时访问problem[0].id也会触发属性读取异常

两种可选实现方案如下:


方案1:用Promise.catch单独兜底problem查询

const memberdata = async function() {
  const somequery1 = await doquery('id','table1','member_id',userid);
  const somequery2 = await doquery('id','table2','member_id',userid);
  const somequery3 = await doquery('id','table3','member_id',userid);
  // 查询异常时兜底返回空数组,不中断后续逻辑
  const problem = await doquery('id','sessions','member_id',userid).catch(err => []);

  return {
    somequery1: somequery1[0].id,
    somequery2: somequery2[0].id,
    somequery3: somequery3[0].id,
    // 数组非空才取id,否则返回null,也可替换为0
    problem: problem.length ? problem[0].id : null
  };
};

memberdata().then(v => {  
  username = v.somequery1;
  sex = v.somequery2;
  age = v.somequery3;
  session = v.problem
// 全局catch兜底所有未知异常,避免出现未处理Promise拒绝警告
}).catch(err => {
  console.error('业务执行异常:', err)
});

方案2:用try...catch包裹problem查询

const memberdata = async function() {
  const somequery1 = await doquery('id','table1','member_id',userid);
  const somequery2 = await doquery('id','table2','member_id',userid);
  const somequery3 = await doquery('id','table3','member_id',userid);
  // 初始化兜底值为null,也可设置为0
  let problemId = null;
  try {
    const problem = await doquery('id','sessions','member_id',userid);
    if (problem.length) problemId = problem[0].id;
  } catch (err) {
    // 异常时直接保留兜底值即可,无需额外处理
  }

  return {
    somequery1: somequery1[0].id,
    somequery2: somequery2[0].id,
    somequery3: somequery3[0].id,
    problem: problemId
  };
};

核心逻辑说明

  • 只针对可能失败的problem查询做单独异常捕获,不会影响前面三个已经执行完成的正常查询结果
  • 增加返回数组的非空判断,避免空数组下标访问导致的隐式异常
  • 全局追加catch兜底,彻底消除未处理Promise拒绝的警告

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:27:03