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

Node.js+Express+MongoDB项目:用户注销后如何清除他人收藏的其发布的帖子?

问题原因

  • 你给Promise.all()传入的是forEach的返回值(undefined),而非异步操作的Promise数组,所有更新操作根本没有被等待执行,就直接走到后面删帖子删用户的逻辑了
  • 先全量查询所有用户再遍历更新的方案性能极低,平台用户量大时会直接卡死,完全没必要手动遍历
  • 多嵌套了两层循环,逻辑冗余,MongoDB的$pull操作本身就支持匹配数组元素,不需要你先判断用户的bookmarks里有没有对应id

修复后的代码

export const deleteUser = async (req, res) => {
  try {
    const user = await User.findById(req.params.userId)
    if (!user) {
      return res.status(404).json({ message: "用户不存在" })
    }
    // 拿到待删除的所有帖子id
    const userPosts = await Post.find({ creatorId: user._id })
    const myPostsIds = userPosts.map(post => post._id) 
    // 如果你的bookmarks存的是字符串格式id,就改成 post._id.toString()

    // 核心逻辑:批量更新所有用户的收藏列表,一次性移除所有待删除的帖子id
    await User.updateMany(
      { bookmarks: { $in: myPostsIds } }, // 仅筛选收藏过这些帖子的用户,避免无效更新
      { $pull: { bookmarks: { $in: myPostsIds } } } // 批量移除数组中的目标id
    )

    // 后续原有逻辑
    await Post.deleteMany({ creatorId: user._id })
    await User.findByIdAndDelete(user._id)
    res.status(200).json({
      message: "Account has been deleted successfully!",
    })
  } catch (err) {
    errorHandler(res, err)
  }
}

内容的提问来源于stack exchange,提问作者Ali Shour

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:27:00