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

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状态。

另外还有两个次要问题需要修正,避免后续功能异常:

  1. 环境变量名不统一:登录接口使用process.env.ACCESS_TOKEN_KEY,但认证中间件使用process.env.ACCESS_TOKEN_SECRET_KEY,需要统一两者的环境变量名,确保JWT签名和验证使用同一个密钥。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:14:55