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

Postman报错cannot read property 'role' of null 角色授权中间件问题排查

问题根因

报错的直接原因是执行角色校验逻辑时req.user的值为null,尝试读取null的role属性触发了报错,和角色校验逻辑本身无关,问题出在前置环节:

  • 路由注册顺序错误,authorizeRoles中间件执行顺序早于身份校验中间件,执行角色校验时req.user还未被赋值
  • 身份校验中间件(JWT解码、session解析逻辑)异常,没有正常挂载req.user对象
  • Postman请求未携带有效身份凭证,身份校验逻辑直接给req.user赋值为null且未提前抛出未登录错误

解决方案

调整中间件执行顺序

确保路由注册时,身份校验中间件永远在角色校验中间件之前执行,示例:

// 错误写法:角色校验在身份校验之前执行
app.get('/admin/data', authorizeRoles('admin'), authenticateToken, (req, res) => {})

// 正确写法:先完成身份校验拿到用户信息,再校验角色权限
app.get('/admin/data', authenticateToken, authorizeRoles('admin'), (req, res) => {})

补全角色校验中间件的空值兼容逻辑

在读取req.user.role前先判断req.user是否存在,避免空值报错:

exports.authorizeRoles = (...roles) => {
  return (req, res, next) => {
    // 新增用户信息存在性校验
    if (!req.user) {
      return next(new ErrorHander('请登录后访问该接口', 401))
    }
    if (!roles.includes(req.user.role)) {
      return next(
        new ErrorHander(
          `角色: ${req.user.role} 无权限访问该资源`,
          403
        )
      );
    }

    next();
  };
};

校验Postman请求配置

  • 检查请求头是否携带了正确的Authorization字段,Bearer Token格式是否符合要求
  • 确认携带的JWT Token未过期、签名正确,身份解码逻辑可正常解析出用户对象
  • 可在身份校验逻辑后打印req.user的值,确认身份校验环节可正常挂载用户信息

内容的提问来源于stack exchange,提问作者abhay singh chauhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:24:03