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

Next.js中TS不同API路由文件共享变量值不更新如何解决?

Next.js API路由间共享状态的解决方案

问题原因

Next.js的API路由在处理请求时,每个路由会被独立实例化:

  • 开发环境下,热重载机制会频繁重置模块,模块级变量每次都会重新初始化
  • 生产环境通常是多进程部署,每个进程拥有独立的内存空间,模块级变量无法跨进程共享

所以你直接导出的counter变量,在/api/test1和/api/test2的实例里是完全独立的副本,修改其中一个不会影响另一个。


解决方案

方案1:内存缓存库(临时存储,服务重启丢失)

适合不需要持久化的临时状态,用node-cache实现跨路由共享:

  1. 安装依赖
npm install node-cache
  1. 创建共享缓存文件lib/cache.js
import NodeCache from 'node-cache';
const cache = new NodeCache();

// 初始化counter默认值
if (!cache.get('counter')) {
  cache.set('counter', 0);
}

export default cache;
  1. 修改/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 });
}
  1. 修改/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为例:

  1. 安装依赖
npm install sqlite3 sqlite
  1. 创建数据库工具文件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 };
  1. 修改/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 });
}
  1. 修改/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这种外部缓存:

  1. 安装依赖
npm install ioredis
  1. 创建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;
  1. 修改/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 });
}
  1. 修改/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:24:57