通过Next.js路由处理API请求:跨请求方法共享变量问题
Next.js API路由跨请求方法共享变量的解决方案
你的代码存在核心问题:Next.js的API路由是无状态的,每次请求都会重新执行handler函数。POST请求里定义的hi只属于当前POST请求的上下文,当新的GET请求过来时,handler重新执行,hi未被定义,会直接抛出ReferenceError。
要在不同请求(同一用户或全局范围)之间共享数据,需根据业务场景选择合适方案:
1. 同一用户跨请求共享(会话级)
如果是同一用户的POST和GET请求共享数据,用会话存储是最合理的方案。以iron-session为例:
首先安装依赖:
npm install iron-session
修改API路由代码:
import { withIronSessionApiRoute } from 'iron-session/next' const sessionOptions = { password: process.env.SECRET_COOKIE_PASSWORD, // 需设置至少32位字符的环境变量 cookieName: 'myapp_session', cookieOptions: { secure: process.env.NODE_ENV === 'production', }, } async function handler(req, res) { if (req.method === 'POST') { // 将数据存入会话 req.session.hi = req.body await req.session.save() res.status(200).json({ message: '数据已保存' }) } if (req.method === 'GET') { // 从会话取出数据 const hi = req.session.hi console.log(hi) res.status(200).json({ data: hi }) } } export default withIronSessionApiRoute(handler, sessionOptions)
2. 全局所有请求共享(应用级)
如果需要所有请求访问同一份临时数据,可使用内存缓存,但注意:服务器重启、横向扩容多实例时,内存数据会丢失,仅适合存储非关键临时数据。
示例代码:
// 在handler外部定义全局变量 let globalHi = null export default function handler(req, res) { if (req.method === 'POST') { globalHi = req.body res.status(200).json({ message: '全局数据已更新' }) } if (req.method === 'GET') { console.log(globalHi) res.status(200).json({ data: globalHi }) } }
3. 持久化共享(可靠存储)
如果数据需要持久化,或要应对服务器重启、多实例场景,使用数据库或Redis这类外部存储:
以Redis为例(先安装ioredis依赖):
import Redis from 'ioredis' const redis = new Redis(process.env.REDIS_URL) export default async function handler(req, res) { if (req.method === 'POST') { await redis.set('hi_key', JSON.stringify(req.body)) res.status(200).json({ message: '数据已存入Redis' }) } if (req.method === 'GET') { const hi = JSON.parse(await redis.get('hi_key')) console.log(hi) res.status(200).json({ data: hi }) } }
内容的提问来源于stack exchange,提问作者GGNoEffort
相关产品推荐
相关产品推荐

