MongoDB Mongoose如何通过用户ID删除被其他集合引用的Cart文档及子文档
问题原因排查
- 错误1:查询购物车使用
Cart.find(),该方法返回数组,空数组也属于真值,!cart判断永远不成立,无法正确识别无对应购物车的情况 - 错误2:执行
Cart.deleteOne()时未添加await,异步删除操作未等待执行完成就返回了成功响应,不仅删除逻辑没生效,删除过程的报错也无法被try/catch捕获 - 优化建议:单用户只会对应一个购物车,查询时用
findOne代替find更符合业务场景,返回的是单个文档对象而非数组,判断逻辑也更准确
修正后完整代码
const deleteCartByUserId = async (req, res, next) => { const userId = req.params.uid; let cart; try { // 改用findOne查询单条文档,返回对象而非数组 cart = await Cart.findOne({ customer: userId }); } catch(err) { const error = new HttpError('删除失败,服务器异常', 500); return next(error); } if(!cart) { const error = new HttpError('未找到对应用户的购物车', 404); return next(error); } try { // 补充await等待删除操作执行完成 await Cart.deleteOne({ customer: userId }); } catch(err) { console.log(err); const error = new HttpError('删除失败,服务器异常', 500); return next(error); } res.status(200).json({ message: '购物车删除成功' }); };
额外注意事项
如果你的业务逻辑中允许单个用户存在多个购物车,需要删除该用户所有购物车的话,可以把deleteOne替换为deleteMany,避免只删除第一个匹配的购物车文档。
内容的提问来源于stack exchange,提问作者Francesco
相关产品推荐
相关产品推荐

