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

