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

封装JWT验证函数后接口请求持续pending的问题排查

JWT验证封装后请求Pending的问题分析与解决

核心问题原因

  1. 中间件未执行next()导致请求挂起
    你将authenticate_token作为路由中间件传入app.get,但该函数没有遵循Express中间件的规则——必须调用next()方法来传递请求到后续处理逻辑。如果不调用next(),Express会认为请求还未处理完成,导致请求一直处于pending状态。

  2. 路由代码的语法错误与冗余调用
    最初的路由代码存在重复app.get的语法错误:

    app.get('/posts',app.get('/posts',authenticate_token,(req,res)=>{...});
    

    同时你在路由处理函数内重复调用authenticate_token(req),既冗余又容易引发逻辑混乱。

正确的实现方式

1. 修正验证中间件

将验证函数改为标准的Express中间件,包含req、res、next三个参数,验证通过后调用next(),失败则直接返回响应:

function authenticate_token(req, res, next) {
  let authstring = req.headers.authorization;
  if (!authstring) {
    return res.json({'status':'error','statusinfo':'please login'});
  }
  // 拆分Bearer令牌,取第二部分
  authstring = authstring.split(' ')[1];
  try {
    const authverified = JWT.verify(authstring, process.env.accTokenSecret);
    // 将验证后的用户信息挂载到req对象,供后续路由使用
    req.user = authverified;
    console.log(authverified);
    // 传递请求到下一个处理函数
    next();
  } catch (err) {
    // 令牌验证失败时返回错误响应
    return res.json({'status':'error','statusinfo':'invalid token'});
  }
}

2. 修正路由配置

路由只需传入中间件和处理函数,无需重复调用验证逻辑,直接从req.user获取已验证的用户信息:

app.get('/posts', authenticate_token, (req, res) => {
  const autheduser = req.user;
  console.log(autheduser);
  // 注意:需匹配用户对象的username字段,原代码直接用对象比较会失效
  res.status(200).json(userinfo.find(user => user.username === autheduser.username));
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 07:48:15