Express.js框架下router.delete()接口无法正常工作如何修复?
问题原因
你调用res.user.cardInfo.remove(req.body)时无法删除对应条目,是因为Mongoose子文档数组的remove()方法仅支持传入子文档实例或子文档的_id值进行匹配删除,你传入的普通req.body对象和数组中存储的子文档不存在引用关系,也没有匹配_id字段,因此无法定位到要删除的卡片。
你之前同类项目逻辑能生效,大概率是之前的请求参数中携带了卡片对应的_id字段,或是你之前的逻辑中先查询到了子文档实例再传入remove()方法。
修复方案
推荐优先使用子文档_id作为删除匹配条件,你可以让前端在调用删除接口时在请求body中携带要删除卡片的cardId(即子文档的_id值),修改后的删除接口代码如下:
//delete card request router.delete("/:id/deletecard", getUser, async (req, res) => { try { if (req.body?.cardId) { // 直接使用Mongoose数组内置的pull方法匹配_id删除,写法更简洁 res.user.cardInfo.pull(req.body.cardId); } const updatedUser = await res.user.save(); res.status(200).json(updatedUser); } catch (error) { res.status(400).json({ message: error.message }); } });
如果你不想用_id匹配,也可以用卡片其他唯一字段(比如卡号cardNumber)做过滤:
if (req.body?.cardNumber) { res.user.cardInfo = res.user.cardInfo.filter(card => card.cardNumber !== req.body.cardNumber); }
额外优化建议
你可以补充删除前的存在校验,避免用户传入不存在的卡片id时接口无提示:
const targetCard = res.user.cardInfo.id(req.body.cardId); if (!targetCard) { return res.status(404).json({message: "未找到要删除的卡片"}); } res.user.cardInfo.pull(req.body.cardId);
内容的提问来源于stack exchange,提问作者Tim Taylor
相关产品推荐
相关产品推荐

