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

Next.js /api路由如何完整转发请求至后端并插入JWT

Next.js API路由完整转发请求并插入JWT的解决方案

下面是能实现请求完整转发、无数据丢失且代码简洁的方案,同时满足插入JWT令牌的需求:

import type { NextApiRequest, NextApiResponse } from 'next'

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
  const BACKEND_API_URL = '你的后端API地址'
  // 复制原请求头,避免修改原请求对象
  const forwardedHeaders = { ...req.headers }
  
  // 插入JWT令牌,替换成你的实际令牌获取逻辑(比如从cookie读取)
  const jwtToken = '你的JWT令牌内容'
  forwardedHeaders.authorization = `Bearer ${jwtToken}`
  
  // 移除host头,避免后端接收到Next.js服务器的host
  delete forwardedHeaders.host

  try {
    // 完整转发所有请求信息
    const backendResponse = await fetch(BACKEND_API_URL, {
      method: req.method,
      headers: forwardedHeaders,
      body: req.body ? JSON.stringify(req.body) : undefined,
      cache: req.cache || 'no-store',
      // 确保带body的请求Content-Type正确
      ...(req.body && { 'content-type': 'application/json' })
    })

    // 读取后端响应体
    const responseBody = await backendResponse.json()

    // 转发后端的响应头给客户端
    backendResponse.headers.forEach((value, key) => {
      res.setHeader(key, value)
    })

    // 返回后端的状态码和响应体
    res.status(backendResponse.status).json(responseBody)
  } catch (error) {
    res.status(500).json({ error: '请求转发失败' })
  }
}

关键细节说明

  • 完整请求转发:直接复用req.method、req.body,复制原请求头并做必要调整,确保请求的所有参数(包括自定义头)都传递给后端。
  • JWT插入逻辑:在复制后的请求头中添加Authorization字段,实际场景中可以从用户的cookie、session或其他存储中获取令牌,替换示例中的固定字符串。
  • 响应完整返回:不仅返回后端的响应体,还将后端的响应头、状态码原封不动转发给客户端,避免丢失诸如Cookie、Content-Type等关键信息。
  • 异常处理:通过try/catch捕获转发过程中的网络错误或后端异常,返回明确的错误信息给客户端。

额外注意事项

  • 如果后端接受表单数据而非JSON,需将body改为new URLSearchParams(req.body),并调整Content-Type为application/x-www-form-urlencoded。
  • GET请求的req.body为undefined,代码中已做判断,避免传递空body导致后端报错。
  • 若原请求包含content-length头,修改body后需重新计算该值,不过仅转发原body时无需额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:36:21