核心思路是将轻量级前置校验(如参数合法性、权限判断)置于逻辑表达式左侧,利用&&/||短路特性避免不必要的数据库查询;缓存读取应优先于db访问;须警惕副作用操作和隐式转换陷阱。

核心思路是:把能快速否定或肯定请求的轻量级条件放在左侧,让数据库查询(重操作)只在必要时才执行。短路本身不减少数据库压力,但能避免它被调用。
前置校验类条件必须放最左
用户身份、权限、参数合法性等判断成本极低,且一旦失败就无需查库。
- 比如:
userId && role === 'admin' && db.queryUsers({ status: 'active' })—— 若userId为空或role不匹配,查询根本不会发起 - 再如:
id > 0 && id —— 排除非法 ID 范围,防止穿透攻击或日志污染
缓存命中判断优先于数据库访问
利用 || 的短路特性,把缓存读取放在左侧,仅当缓存未命中时才查库。
- 示例:
cache.get(key) || db.fetchData(key)——cache.get()返回真值(非 null/undefined/''/0)即终止,不触发 DB 查询 - 注意:确保缓存层返回的是 truthy 值;若可能返回
false或0等 falsy 结果,需包装为对象,如cache.get(key) ?? db.fetchData(key)更稳妥
防御性空值与状态检查
对入参或上下文对象做存在性、有效性断言,防止无效查询被构造和发送。
req.body && req.body.userId && req.body.orderId && db.updateOrder(req.body)-
tenantId && isActiveTenant(tenantId) && db.queryLogs({ tenantId, from, to })—— 先确认租户有效,再查其日志 - 特别注意:像
db.query(...).length > 0这类表达式绝不能放左侧,它本身就会触发一次完整查询,短路完全失效
警惕副作用与隐式转换陷阱
短路依赖真假值判断,而数据库方法通常返回 Promise 或 QueryBuilder 对象(truthy),无法靠返回值控制流程。
- 错误写法:
isValidInput() && db.find({ name }).then(...)——.then()是链式调用,不是表达式结果,短路不起作用 - 正确做法:将 DB 操作封装为函数,如
isValidInput() && fetchUserFromDb(name),且fetchUserFromDb内部才真正发起查询 - 含副作用的操作(如记录审计日志、更新计数器)不要塞进短路表达式右侧,应拆到独立 if 块中显式控制











