Express/Node.js开发:是否需始终检查数据库中文档是否存在?
关于控制器中冗余错误检查的必要性分析
核心结论
这种冗余检查并非完全没必要,但要分场景权衡,不能一概而论。
1. 为什么有时候需要保留?
- 极端异常场景兜底:注册流程可能出现意外(比如数据库写入失败、异步任务丢包、第三方服务回调异常),导致本该创建的Friends文档没生成。这种概率低,但一旦发生,提前检查能避免后续操作抛出更难排查的错误(比如
push操作因文档不存在报错)。 - 代码鲁棒性:如果后续业务逻辑变更(比如允许用户注销后重新注册,而旧的清理流程没删干净Friends文档;或者注册流程新增分支跳过了创建步骤),提前的检查能让代码适配这些变化,不至于直接崩掉。
2. 什么时候可以简化?
- 业务逻辑绝对闭环:如果注册流程是同步强校验+事务保证(比如创建用户和创建Friends文档在同一个数据库事务里,要么都成功要么都回滚),且没有任何业务分支会跳过创建步骤,那这种检查确实冗余,可以去掉。
- 用数据库层面约束兜底:比如给用户ID加唯一索引,且Friends模型设置为用户创建时自动关联(比如MongoDB的
$setOnInsert或者SQL的外键约束+默认关联),后续操作直接用update类语句,既保证操作原子性,又省去提前查询的步骤。
举个实际优化例子
原来的冗余代码:
// 先查询检查 const friendDoc = await Friends.findOne({ userId: currentUserId }); if (!friendDoc) { return res.status(500).send("好友列表初始化异常"); } // 再执行push操作 await Friends.updateOne({ userId: currentUserId }, { $push: { requests: targetUserId } });
优化为原子操作(省去查询步骤):
await Friends.updateOne( { userId: currentUserId }, { $push: { requests: targetUserId } }, { upsert: true } // 不存在则自动创建文档 );
这样既保证了操作的可靠性,又减少了一次数据库查询,提升性能。
内容的提问来源于stack exchange,提问作者milan.dzeki
相关产品推荐
相关产品推荐

