You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:24:04