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

Next.js中间件校验JWT访问令牌时遇JSON解析错误求排查

问题分析与解决方案

这个错误SyntaxError: Unexpected token < in JSON at position 4本质是你尝试解析的响应内容不是合法JSON,而是HTML文本(比如外部API返回了4xx/5xx错误页面,开头是<html>标签)。结合你在Next.js Middleware中校验JWT的场景,常见原因和解决方式如下:

1. 自定义Headers格式错误

Next.js Middleware中的request.headers是Headers对象,直接传给fetch的headers参数时,可能携带了大量Next.js内部头信息,被外部API拒绝后返回错误页面:

// 错误写法:传递了所有请求头,包含API不识别的字段
const res = await fetch('https://your-api.com/validate-token', {
  headers: request.headers
})

// 正确写法:只提取所需的校验头,手动构造Headers
const authHeader = request.headers.get('Authorization')
const res = await fetch('https://your-api.com/validate-token', {
  method: 'GET',
  headers: new Headers({
    'Authorization': authHeader || '',
    'Content-Type': 'application/json' // 明确指定请求格式
  })
})

2. 未先校验API响应状态

外部API可能因令牌无效、权限不足或自身故障返回401/404/500状态码,此时返回的是HTML错误页而非JSON。必须先判断响应状态再解析:

const res = await fetch('https://your-api.com/validate-token', { /* ... */ })

// 先检查响应是否正常
if (!res.ok) {
  if (res.status === 401) {
    // 令牌无效,重定向到登录页或返回401响应
    return NextResponse.redirect(new URL('/login', request.url))
  }
  // 其他错误可记录日志或抛出异常
  throw new Error(`API请求失败:${res.status}`)
}

// 状态正常再解析JSON
const data = await res.json()

3. Edge Runtime的fetch限制

Next.js Middleware运行在Edge Runtime环境,fetch行为和浏览器/Node.js有差异:

  • 避免传递host等Next.js内部头,这类头可能触发API的安全校验
  • 确保外部API支持Edge Runtime的fetch特性(比如不依赖Node.js专属的请求头)

4. JWT令牌格式错误

如果你的Authorization头缺少Bearer 前缀,或令牌本身格式损坏,API可能直接返回错误页面而非JSON响应:

const authHeader = request.headers.get('Authorization')
if (!authHeader || !authHeader.startsWith('Bearer ')) {
  // 处理令牌格式错误
  return NextResponse.json({ error: '令牌格式无效' }, { status: 400 })
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:47:36