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
相关产品推荐
相关产品推荐

