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
相关产品推荐
相关产品推荐

