封装JWT验证函数后接口请求持续pending的问题排查
JWT验证封装后请求Pending的问题分析与解决
核心问题原因
中间件未执行
next()导致请求挂起
你将authenticate_token作为路由中间件传入app.get,但该函数没有遵循Express中间件的规则——必须调用next()方法来传递请求到后续处理逻辑。如果不调用next(),Express会认为请求还未处理完成,导致请求一直处于pending状态。路由代码的语法错误与冗余调用
最初的路由代码存在重复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
相关产品推荐
相关产品推荐

