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

Express电商后端Auth中间件打印undefined role问题求助

Express Auth中间件req.user.role为undefined的排查方案

问题描述

我使用Express和MySQL开发电商应用后端,需要通过中间件保护路由并校验用户身份是卖家还是买家。但编写的Auth中间件始终报错,打印req.user.role结果为undefined,请求排查问题原因。

相关代码

Auth中间件代码

const jwt = require('jsonwebtoken');

const auth = (req, res, next) => {
  try {
    const token = req.headers.authorization.split(' ')[1];

    if (!token) {
      return res.status(401).json({
        status: 'error',
        error: 'Authentication failed',
      });
    }

    const decodedToken = jwt.verify(token, 'JWT_SECRET');
    req.user = decodedToken;
    console.log(req.user.role);
    

    next();
  } catch (error) {
    return res.status(500).json({
      status: 'error',
      data: error.message,
    });
  }
};

const isSeller = (req, res, next) => {
  try{
    //console.log(req.user.role);
    if (!req.user || req.user.role !== 'seller') {
      return res.status(403).json({
        status: 'error',
        error: 'User is not a seller',
      });
    }
    next();
  }catch (error) {
    return res.status(500).json({
      status: 'error',
      error: error.message,
    });
  }
};

module.exports = {
  auth,
  isSeller,
};

登录生成JWT Token代码

const token = jwt.sign(
    { 
      userId: existingUserByUsername.id,
      username: existingUserByUsername.username,
      email: existingUserByUsername.email,
      role: existingUserByUsername.role
    },
    'JWT_SECRET'
  );
  return token;

排查方向及解决方案

  • 检查Token生成时role字段的来源
    核心确认existingUserByUsername.role是否有效:

    • 验证MySQL查询用户的SQL语句,是否明确查询了role字段(例如SELECT id, username, email, role FROM users WHERE username = ?),若未查询该字段,existingUserByUsername.role会是undefined,导致Token中不包含role属性。
    • 在生成Token前打印existingUserByUsername对象,确认是否存在role属性,且值为seller/buyer这类预期值。
  • 验证请求头Authorization的格式
    中间件通过req.headers.authorization.split(' ')[1]获取Token,依赖Bearer <token>的标准格式:

    • 检查前端请求是否正确设置Authorization头,格式需严格为Bearer 你的Token字符串,若缺少Bearer前缀或空格错误,split后取索引[1]会得到undefined,后续JWT验证失败,req.user无法被赋值。
    • 在auth中间件开头添加console.log(req.headers.authorization),直接查看请求头内容是否符合要求。
  • 确认JWT密钥完全一致
    生成Token和验证Token使用的密钥必须完全匹配:

    • 检查代码中是否存在环境差异(例如生产环境用环境变量存储密钥,开发环境硬编码),若密钥不匹配,jwt.verify会抛出错误,进入catch块,req.user不会被设置。
    • 在jwt.verify后打印decodedToken,确认解析后的对象是否包含role字段。
  • 检查中间件的使用顺序
    路由必须先执行auth中间件,再执行isSeller中间件:
    正确的路由配置示例:

    app.post('/seller-api', auth, isSeller, (req, res) => {
      // 业务逻辑
    });
    

    若顺序颠倒,isSeller执行时req.user尚未被赋值,会直接触发权限错误。

  • 排查Token有效性
    若Token过期或被篡改,jwt.verify会失败,导致req.user未被初始化:

    • 查看catch块中的错误信息,确认是否为Token无效/过期的问题;生成Token时可添加过期时间参数(例如expiresIn: '1h'),避免长期有效带来的安全问题。

内容的提问来源于stack exchange,提问作者fay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:45:42