报错:roles.include is not a function,传入数组仍无法解决
问题解决:roles.include is not a function 及权限验证逻辑修复
1. 直接报错原因
你写的roles.include('admin')是方法名拼写错误,JavaScript数组中用于判断元素是否存在的正确方法是**includes()**(注意末尾有个s),把include改成includes就能解决这个报错。
2. 更关键的逻辑问题
但你当前的代码逻辑完全没实现“验证用户是否为管理员”的需求——现在的逻辑只是检查你传入的roles数组里有没有admin,只要你调用isAuthorized(['admin']),所有请求都会直接通过,根本不会去校验当前登录用户的实际角色。
修复后的完整代码示例
假设你的用户信息存在req.user中(比如通过登录验证中间件存入的),且用户对象里有role字段,修复后的isAuthorized应该是这样:
module.exports.isAuthorized = function isAuthorized(allowedRoles) { return function(req, res, next) { try { // 先检查用户是否已登录(根据你的实际登录校验逻辑调整) if (!req.user) { return res.status(401).json({ message: "User not logged in" }); } // 检查当前用户的角色是否在允许的角色列表中 if (allowedRoles.includes(req.user.role)) { next(); } else { res.status(403).json({ message: "User not authorized" }); } } catch (error) { return res.status(500).json({ message: error.message }); } } }
说明
- 把参数名从
roles改成allowedRoles是为了语义更清晰,区分传入的允许角色列表和用户自身的角色 - 增加了用户登录状态的校验,避免未登录用户触发后续逻辑
- 使用
403 Forbidden代替401 Unauthorized:401一般用于未认证(没登录),403用于已认证但无权限,语义更准确 - 核心逻辑是校验当前请求用户的角色是否在允许的角色数组中,这才是权限验证的本质
内容的提问来源于stack exchange,提问作者Vedant Agarwal
相关产品推荐
相关产品推荐

