Mongoose findByIdAndUpdate无法更新数据库记录求助
问题排查与修复方案
你的购物车记录无法更新,核心原因是异步操作未正确等待,同时存在潜在的数据类型匹配问题,以下是具体分析和修复步骤:
1. 未等待异步数据库操作完成
Cart.findByIdAndUpdate是异步方法,返回的是Promise对象,你没有使用await关键字,导致updateCart只是一个未执行完成的Promise实例,而非实际更新后的文档。这会让后续的if (!updateCart)判断失效(Promise对象始终为真值),且代码会在数据库更新完成前就返回响应,根本没触发实际的更新操作。
修复: 在findByIdAndUpdate前添加await关键字:
const updateCart = await Cart.findByIdAndUpdate(id, { $addToSet: { items: addItem } }, { new: true });
2. 冗余参数优化(非核心但建议修正)
在Mongoose 6+版本中,new: true和returnDocument: "after"作用完全一致,同时设置属于冗余,保留其中一个即可。
3. 潜在数据类型不匹配问题
你的Schema里itemId定义为Number类型,但product._id通常是MongoDB的ObjectId(字符串格式),直接赋值会导致类型不匹配,可能让$addToSet无法正确识别重复项或添加失败。
可选修复方案二选一:
- 修改Schema的
itemId类型为ObjectId:itemId: { type: mongoose.Schema.Types.ObjectId, }, - 将
product._id转换为数字(仅当_id本身是数字格式字符串时适用):const addItem = { itemId: Number(product._id), sku: product.sku, quantity: 1, price: product.price };
修复后的完整代码
exports.add = async (req, res, next) => { const { id, product } = req.body; // 根据实际情况处理itemId类型转换 const addItem = { itemId: Number(product._id), sku: product.sku, quantity: 1, price: product.price }; console.log(addItem); try { const updateCart = await Cart.findByIdAndUpdate(id, { $addToSet: { items: addItem } }, { new: true }); if (!updateCart) return next(new ErrorResponse("Unable to update the cart record", 404)); console.log(updateCart); return sendRes(updateCart, 200, res); } catch (error) { console.log(error); next(error); } };
注:原代码中if (updateCart)和else分支逻辑重复,在判断!updateCart返回404后,直接返回200响应即可。
内容的提问来源于stack exchange,提问作者Andrew Vargas
相关产品推荐
相关产品推荐

