Mongoose删除操作失败时,能否获取详细的查询失败原因?
区分Mongoose deleteOne删除失败的具体原因
你当前用deleteOne只能通过deletedCount判断是否删除成功,但没法区分是flowId不存在,还是用户权限不匹配。要解决这个问题,有两种实用的方案:
方案1:先查询文档,明确原因后再删除
先单独用flowId查询目标文档,依次判断文档是否存在、权限是否匹配,再执行删除操作:
// 先查找目标文档 const targetFlow = await Flow.findOne({ _id: flowId }); if (!targetFlow) { throw new BadRequestError("Flow not found"); } if (targetFlow.permissions !== currentUser!.id) { throw new BadRequestError("无权限删除该Flow"); } // 确认条件满足后执行删除 const deleteResult = await Flow.deleteOne({ _id: flowId });
方案2:用findOneAndDelete结合二次查询
findOneAndDelete会返回被删除的文档(删除失败则返回null),此时再查询原文档是否存在,就能区分失败原因:
const deletedFlow = await Flow.findOneAndDelete({ _id: flowId, permissions: currentUser!.id, }); if (!deletedFlow) { // 查询该flowId对应的文档是否存在 const existingFlow = await Flow.findById(flowId); if (!existingFlow) { throw new BadRequestError("Flow not found"); } else { throw new BadRequestError("无权限删除该Flow"); } }
注意
deleteOne本身只返回删除计数,无法直接提供失败的具体原因,所以必须通过额外的查询步骤来区分两种失败场景。虽然多了一次数据库请求,但能给用户返回更精准的错误提示。
内容的提问来源于stack exchange,提问作者aviram
相关产品推荐
相关产品推荐

