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

报错: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 22:32:04