Express服务器API接口请求持续Pending的问题排查求助
Express JWT认证接口请求挂起问题解决
我在Node.js环境搭建了Express服务器,包含若干REST API接口,其中用JWT实现的认证接口为http://localhost:3000/login。服务器能正常启动,但使用Postman、VSCode REST Client等工具调用接口时,请求一直处于Pending状态,无法获取响应。
服务器代码
require("dotenv").config() const express = require('express') const app = express() const jwt = require('jsonwebtoken') app.use(express.json) // 核心错误点 const posts = [ { username: "kyle", name: "post1" }, { username: "Tyler", name: "post2" }, ] const authenticateToken = (request, response, next) => { const authHeader = request.headers['authorization'] const token = authHeader && authHeader.split(' ')[1] if(token === null) { return response.sendStatus(401)} // 判断逻辑不严谨 jwt.verify(token , process.env.ACCESS_TOKEN_SECRET_KEY, (err, user) => { if(err) return response.sendStatus(403) request.user = user next() }) } app.get("/posts", authenticateToken, (request, response) => { const filteredPosts = posts.filter(post => post.username === request.user.username) response.json(filteredPosts) }) app.post("/login", (request, response) => { const username = request.body.username const user = {username: username} const accessToken = jwt.sign(user, process.env.ACCESS_TOKEN_KEY) // 环境变量名不统一 response.json({accessToken: accessToken}) }) app.listen(3000, () => { console.log(`app is listening on port: 3000`) })
package.json内容
{ "name": "api", "version": "1.0.0", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "description": "", "dependencies": { "dotenv": "^16.4.5", "express": "^4.19.2", "jsonwebtoken": "^9.0.2" } }
问题排查与解决
请求挂起的核心原因是未正确注册JSON解析中间件:
- 代码中
app.use(express.json)缺少括号,正确写法应为app.use(express.json())。express.json()是一个函数,调用后才会返回处理JSON请求体的中间件,不调用的话中间件无法生效,导致Express无法处理请求,请求一直处于Pending状态。
另外还有两个次要问题需要修正,避免后续功能异常:
- 环境变量名不统一:登录接口使用
process.env.ACCESS_TOKEN_KEY,但认证中间件使用process.env.ACCESS_TOKEN_SECRET_KEY,需要统一两者的环境变量名,确保JWT签名和验证使用同一个密钥。 - Token空值判断不严谨:
if(token === null)只能处理null,无法处理undefined(当请求头没有authorization时,authHeader为undefined,token也会是undefined),应改为if(token == null),覆盖null和undefined两种情况,正确返回401状态码。
修正后的核心代码片段
// 正确注册JSON解析中间件 app.use(express.json()) // 修正Token空值判断 const authenticateToken = (request, response, next) => { const authHeader = request.headers['authorization'] const token = authHeader && authHeader.split(' ')[1] if(token == null) { return response.sendStatus(401)} // 统一环境变量名 jwt.verify(token , process.env.ACCESS_TOKEN_SECRET_KEY, (err, user) => { if(err) return response.sendStatus(403) request.user = user next() }) } app.post("/login", (request, response) => { const username = request.body.username const user = {username: username} // 使用统一的环境变量名 const accessToken = jwt.sign(user, process.env.ACCESS_TOKEN_SECRET_KEY) response.json({accessToken: accessToken}) })
内容的提问来源于stack exchange,提问作者Nadhir NACEF
相关产品推荐
相关产品推荐

