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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:03:36