Next.js中TS不同API路由文件共享变量值不更新如何解决?
Next.js API路由间共享状态的解决方案
问题原因
Next.js的API路由在处理请求时,每个路由会被独立实例化:
- 开发环境下,热重载机制会频繁重置模块,模块级变量每次都会重新初始化
- 生产环境通常是多进程部署,每个进程拥有独立的内存空间,模块级变量无法跨进程共享
所以你直接导出的counter变量,在/api/test1和/api/test2的实例里是完全独立的副本,修改其中一个不会影响另一个。
解决方案
方案1:内存缓存库(临时存储,服务重启丢失)
适合不需要持久化的临时状态,用node-cache实现跨路由共享:
- 安装依赖
npm install node-cache
- 创建共享缓存文件
lib/cache.js
import NodeCache from 'node-cache'; const cache = new NodeCache(); // 初始化counter默认值 if (!cache.get('counter')) { cache.set('counter', 0); } export default cache;
- 修改
/api/test1.js
import cache from '../../lib/cache'; export default function handler(req, res) { let counter = cache.get('counter'); counter += 5; cache.set('counter', counter); res.status(200).json({ counter }); }
- 修改
/api/test2.js
import cache from '../../lib/cache'; export default function handler(req, res) { const counter = cache.get('counter'); console.log('counter', counter); res.status(200).json({ counter }); }
方案2:数据库(持久化存储)
适合需要永久保存的状态,以SQLite为例:
- 安装依赖
npm install sqlite3 sqlite
- 创建数据库工具文件
lib/db.js
import sqlite3 from 'sqlite3'; import { open } from 'sqlite'; async function getDb() { return open({ filename: './database.sqlite', driver: sqlite3.Database }); } // 初始化表和默认值 async function initDb() { const db = await getDb(); await db.run('CREATE TABLE IF NOT EXISTS counter (value INTEGER)'); const exists = await db.get('SELECT value FROM counter LIMIT 1'); if (!exists) { await db.run('INSERT INTO counter (value) VALUES (0)'); } } initDb(); export { getDb };
- 修改
/api/test1.js
import { getDb } from '../../lib/db'; export default async function handler(req, res) { const db = await getDb(); await db.run('UPDATE counter SET value = value + 5'); const result = await db.get('SELECT value FROM counter'); res.status(200).json({ counter: result.value }); }
- 修改
/api/test2.js
import { getDb } from '../../lib/db'; export default async function handler(req, res) { const db = await getDb(); const result = await db.get('SELECT value FROM counter'); console.log('counter', result.value); res.status(200).json({ counter: result.value }); }
方案3:Redis(分布式/多进程环境)
如果生产环境是多进程集群部署,内存缓存无法跨进程共享,需要用Redis这种外部缓存:
- 安装依赖
npm install ioredis
- 创建Redis工具文件
lib/redis.js
import Redis from 'ioredis'; const redis = new Redis(); // 初始化counter默认值 redis.get('counter').then(val => { if (!val) redis.set('counter', 0); }); export default redis;
- 修改
/api/test1.js
import redis from '../../lib/redis'; export default async function handler(req, res) { await redis.incrby('counter', 5); const counter = await redis.get('counter'); res.status(200).json({ counter }); }
- 修改
/api/test2.js
import redis from '../../lib/redis'; export default async function handler(req, res) { const counter = await redis.get('counter'); console.log('counter', counter); res.status(200).json({ counter }); }
内容的提问来源于stack exchange,提问作者Uolary
相关产品推荐
相关产品推荐

