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

