使用better-sqlite3时如何处理查询行不存在的报错?
错误原因
better-sqlite3的get()方法在没有匹配到查询条件的行时,会返回undefined。你的代码没有对返回结果做判空处理,直接链式读取.businessType属性,就会触发「读取未定义对象的属性」类错误,导致脚本直接崩溃。
另外原代码直接将author.id拼接入SQL语句,存在SQL注入风险,建议优先使用参数化查询。
修复方案
全版本兼容写法
// 预编译SQL,使用参数占位符避免注入风险 const queryStmt = DB.prepare('SELECT businessType FROM Profiles WHERE userId = ?'); // 传入参数执行查询 const result = queryStmt.get(author.id); let businessType; if (result) { businessType = result.businessType; } else { businessType = '用户不存在'; }
简化语法写法(ES2020及以上环境支持)
可以结合可选链运算符?.和空值合并运算符??实现一行完成逻辑:
const businessType = DB.prepare('SELECT businessType FROM Profiles WHERE userId = ?') .get(author.id) ?.businessType ?? '用户不存在';
- 可选链
?.会在查询结果为undefined时直接终止属性读取,不会抛出错误 - 空值合并
??会在左侧值为undefined/null时,返回右侧的自定义默认提示
内容的提问来源于stack exchange,提问作者Syntaxis
相关产品推荐
相关产品推荐

