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

