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

Express中间件中jsonwebtoken verify调用next()不生效如何解决

JWT校验中间件next()无法流转路由问题修复

核心故障点

  • 路由业务代码存在未定义变量报错:/booking路由中你注释了authorization变量的声明语句,但后续依然执行console.log(authorization),代码运行到此处会直接抛出ReferenceError,触发接口500错误,表现为中间件校验通过后也无法返回预期数据,和next()失效的现象完全一致。
  • JWT中间件缺少边界判断:没有校验Authorization头格式是否符合Bearer <token>规范,当请求头格式错误时,split(" ")[1]取到的token值为undefined,传入jwt.verify会直接抛出同步错误,不会进入你写的异步回调分支,既不会返回错误响应也不会调用next(),请求直接挂起。
  • (非阻断类问题)console.log(decoded)写在next()调用之后,会等后续路由逻辑全部执行完才会打印日志,容易干扰排查时的执行顺序判断。

修复后代码

首先是补全边界处理的verifyJwt中间件:

// JWT校验中间件
function verifyJwt(req, res, next) {
  const authHeaders = req.headers.authorization;
  if (!authHeaders) {
    return res.status(401).send({ message: "Unauthorized access" });
  }
  // 校验Bearer头格式,避免取到空token
  const tokenParts = authHeaders.split(" ");
  if (tokenParts.length !== 2 || tokenParts[0] !== "Bearer") {
    return res.status(401).send({ message: "Invalid authorization header format" });
  }
  const token = tokenParts[1];
  // 捕获jwt.verify可能抛出的同步异常
  try {
    jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, function (err, decoded) {
      if (err) {
        return res.status(403).send({ message: "Forbidden Access" });
      }
      req.decoded = decoded;
      console.log(decoded);
      next();
    });
  } catch (verifyErr) {
    return res.status(403).send({ message: "Forbidden Access" });
  }
  console.log(token);
}

然后是修正变量引用错误、补全异常捕获的/booking路由:

// 预约信息查询接口
app.get("/booking", verifyJwt, async (req, res) => {
  try {
    const patientEmail = req.query.patientEmail;
    const decodedEmail = req.decoded.patientEmail;
    if (patientEmail !== decodedEmail) {
      return res.status(403).send({ message: "Forbidden Access" });
    }
    const query = { patientEmail: patientEmail };
    const services = await bookingCollection.find(query).toArray();
    // 需要打印请求头直接从req对象取,不要引用未定义变量
    console.log(req.headers.authorization);
    return res.send(services);
  } catch (err) {
    // 捕获数据库查询等异步操作的异常,避免请求挂起
    return res.status(500).send({ message: "Internal server error" });
  }
});

验证注意项

  • 测试时确保请求头Authorization值格式为Bearer 有效JWT令牌,不要漏写Bearer前缀和中间的空格。
  • 确认process.env.ACCESS_TOKEN_SECRET和生成JWT时使用的密钥完全一致,否则校验会直接返回403。
  • 所有带异步逻辑的Express路由都建议加trycatch包裹,避免运行时错误导致服务无响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:18:24