Node.js搭建博客CMS时管理员删除任意用户功能失效如何修复
问题根因分析
接口一直加载无返回的核心原因是代码存在逻辑分支未返回响应,同时存在路由规则、权限判断的逻辑错误,具体问题如下:
- 路由路径重复冲突:你写的普通用户自删接口和管理员删除接口使用了完全相同的路径
router.delete("/:id"),Express会优先执行先注册的自删接口,你写的管理员删除代码根本不会被触发 - 权限判断逻辑错误:管理员删除其他用户时,
req.body.userId是当前登录管理员的ID,req.params.id是要被删除的目标用户ID,你代码开头判断两者相等,等于要求管理员只能删除自己的账号,完全不符合需求 - 分支无返回导致请求挂起:当第一个
if(req.body.userId === req.params.id)条件不成立时,代码没有任何返回响应的逻辑,请求会一直处于等待状态,就是你在Postman看到的一直加载的情况 - 嵌套try catch写法冗余,没有必要写两层嵌套的异常捕获
修复方案
推荐把自删和管理员删除逻辑合并为同一个接口,避免路由冲突,修正后代码如下,直接替换你原来的两个重复的删除接口即可:
// 统一用户删除接口:支持普通用户自删、管理员删除任意普通用户 router.delete("/:id", async (req, res) => { try { // 获取当前操作者的账号信息 const currentUser = await User.findById(req.body.userId); if (!currentUser) { return res.status(401).json("操作者身份无效"); } // 权限判断:要么是删除自己的账号,要么操作者是管理员 const isSelfDelete = req.body.userId === req.params.id; const isAdminOperator = currentUser.role === "admin"; if (!isSelfDelete && !isAdminOperator) { return res.status(401).json("你没有权限删除该用户"); } // 查找待删除的目标用户 const targetUser = await User.findById(req.params.id); if (!targetUser) { return res.status(404).json("待删除用户不存在"); } // 可选限制:避免管理员删除其他管理员账号,可根据需求调整 if (isAdminOperator && targetUser.role === "admin" && !isSelfDelete) { return res.status(403).json("不能删除其他管理员账号"); } // 执行删除关联数据+用户账号 await Post.deleteMany({username: targetUser._id}); await Comment.deleteMany({author: targetUser._id}); await Reply.deleteMany({author: targetUser._id}); await User.findByIdAndDelete(req.params.id); res.status(200).json("用户已删除"); } catch (err) { res.status(500).json(err); } });
测试时注意在Postman的请求体中传入正确的当前操作者userId参数即可。
内容的提问来源于stack exchange,提问作者kinhs
相关产品推荐
相关产品推荐

