NextJS中跨API调用共享全局服务端变量的TS实现问题
Next.js API路由跨请求共享内存对象问题解决
问题根本原因
这跟TypeScript完全没关系,是Next.js API路由的运行机制导致的:
- Next.js的每个API请求都会启动独立的服务实例(无服务器环境下是独立的函数实例)
- 你定义的
users是模块级变量,只存在于当前请求的内存空间里,请求结束后实例销毁,新请求的实例里users就是全新的空对象 - 所以/auth.ts里存入的值只在那个请求的实例有效,/verify.ts的请求是另一个实例,自然读不到数据
无需数据库的解决方案
如果不想用数据库,要跨请求共享数据,可以用全局内存缓存工具node-cache,它能在整个Node.js进程里共享缓存数据:
1. 安装依赖
npm install node-cache # 或者用yarn yarn add node-cache
2. 重构utils/users.ts
import NodeCache from 'node-cache'; // 修正类型定义,用小写number(TS里Number是构造函数,推荐用基础类型number) type User = { address: string; nonce: number; }; // 创建缓存实例,可设置过期时间(比如60秒,按需调整) const userCache = new NodeCache({ stdTTL: 60 }); // 封装缓存操作方法 export const users = { // 存入用户数据 set: (key: string, value: User) => userCache.set(key, value), // 根据key读取用户 get: (key: string) => userCache.get<User>(key), // 获取所有用户 getAll: () => { const allKeys = userCache.keys(); return allKeys.reduce((acc, key) => { acc[key] = userCache.get<User>(key); return acc; }, {} as Record<string, User>); }, };
3. 修改/auth.ts使用缓存
import type { NextApiRequest, NextApiResponse } from 'next'; import { users } from '../../utils/users'; export default function auth(req: NextApiRequest, res: NextApiResponse) { // 假设从请求体拿到address和nonce const { address, nonce } = req.body; // 存入缓存 users.set(address, { address, nonce }); // 打印当前所有缓存的用户 console.log('当前缓存用户:', users.getAll()); res.status(200).json({ success: true }); }
4. 修改/verify.ts读取缓存
import type { NextApiRequest, NextApiResponse } from 'next'; import { users } from '../../utils/users'; export default function verify(req: NextApiRequest, res: NextApiResponse) { const { address } = req.query; // 根据地址读取用户 const user = users.get(address as string); console.log('读取到的用户:', user); console.log('所有缓存用户:', users.getAll()); if (user) { res.status(200).json(user); } else { res.status(404).json({ message: '用户未找到' }); } }
注意事项
- 这个方案仅适用于单服务器实例场景(比如本地开发、单个VPS),如果是多实例部署(比如Vercel自动扩容、多Lambda),不同实例的缓存是独立的,还是会出现数据不共享的问题
- 如果需要多实例环境共享数据,建议用Redis这类分布式缓存,或者轻量数据库比如SQLite
内容的提问来源于stack exchange,提问作者InterestingGuy
相关产品推荐
相关产品推荐

