JavaScript中删除数组内指定条件对象失效的问题求解
问题根因
你修改的仅为内存中的数组副本,没有将改动持久化到MongoDB数据库,因此实际存储的数据不会发生变化,同时代码还存在边界风险和状态码使用不规范的问题。
修正步骤
- 完成数组修改后,调用
campus.save()将变更同步到数据库 - 先校验是否存在符合条件的
campus director对象,避免findIndex返回-1时误删其他数据 - 调整响应状态码,删除成功使用200语义更准确,201为资源创建专用状态码
修正后代码
router.delete("/:id/director", userAuth, checkRole(["admin"]), async(req, res) => { try { const campus = await Campus.findById(req.params.id); // 查找匹配对象的索引 const directorIndex = campus.admins.findIndex(e => e.title === "campus director"); // 校验是否存在对应数据 if (directorIndex === -1) { return res.status(404).json("未找到对应的校园主管数据"); } // 删除数组中对应元素 campus.admins.splice(directorIndex, 1); // 保存变更到数据库 await campus.save(); res.status(200).json("已成功删除校园主管"); } catch (err) { res.status(500).json(err); } })
可选优化方案
你也可以直接使用MongoDB的数组更新操作符$pull完成单步更新,不用先查询再修改再保存,性能更高:
router.delete("/:id/director", userAuth, checkRole(["admin"]), async(req, res) => { try { const updateResult = await Campus.findByIdAndUpdate( req.params.id, { $pull: { admins: { title: "campus director" } } }, { new: true } ); if (!updateResult) { return res.status(404).json("未找到对应校园数据"); } res.status(200).json("已成功删除校园主管"); } catch (err) { res.status(500).json(err); } })
内容的提问来源于stack exchange,提问作者Obajuwon
相关产品推荐
相关产品推荐

