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

NodeJS/ExpressJS服务端:如何将大JSON加载至内存供模块调用

实现大JSON文件的内存常驻与模块共享

完全可以把这两个JSON文件加载到内存中,让所有业务模块复用这份数据,避免重复读取文件的开销。以下是适配你的ES6+Node.js/Express结构的具体实现方案:

1. 创建专门的JSON加载模块

在项目中新建一个负责加载并缓存JSON数据的模块,比如data/cachedJson.js:

// data/cachedJson.js
import fs from 'fs/promises';
import path from 'path';

// 定义JSON文件的绝对路径
const firstJsonPath = path.resolve(process.cwd(), 'your/path/first.json');
const secondJsonPath = path.resolve(process.cwd(), 'your/path/second.json');

// 模块级变量缓存解析后的JSON数据
let firstJson, secondJson;

// 异步加载数据的初始化函数
export async function initCachedJson() {
  if (!firstJson) {
    const rawFirst = await fs.readFile(firstJsonPath, 'utf8');
    firstJson = JSON.parse(rawFirst);
  }
  if (!secondJson) {
    const rawSecond = await fs.readFile(secondJsonPath, 'utf8');
    secondJson = JSON.parse(rawSecond);
  }
}

// 导出缓存的数据
export { firstJson, secondJson };

2. 在server.js启动时预加载数据

确保在Express服务器启动前完成JSON数据的加载,避免业务模块使用时数据未就绪:

// server.js
import express from 'express';
import { initCachedJson } from './data/cachedJson.js';
// 导入你的业务路由模块
import userRouter from './modules/userRouter.js';

const app = express();

async function startServer() {
  // 先加载JSON到内存
  await initCachedJson();
  
  // 注册路由和中间件
  app.use('/api/users', userRouter);
  
  // 启动服务器
  app.listen(3000, () => {
    console.log('Server running on port 3000');
  });
}

startServer();

3. 在业务模块中直接复用缓存数据

任何业务模块都可以直接导入缓存好的JSON数据,它们指向的是内存中的同一份对象,无需重复读取文件:

// modules/userRouter.js
import express from 'express';
import { firstJson, secondJson } from '../data/cachedJson.js';

const router = express.Router();

router.get('/profile', (req, res) => {
  // 直接使用内存中的JSON数据
  const userProfile = firstJson.profiles.find(p => p.id === req.query.userId);
  res.json(userProfile);
});

export default router;

核心细节说明

  • 模块缓存特性:Node.js会缓存模块的导出结果,所以所有导入cachedJson.js的模块拿到的都是同一组内存对象,不会重复加载解析JSON。
  • 内存占用控制:50MB的JSON文件解析后内存占用大概是原文件的1.5-2倍,两个文件总占用约200MB左右,对于服务2000人的应用来说完全在合理范围内。
  • 初始化时机:通过initCachedJson在服务器启动前完成加载,彻底避免业务逻辑中出现数据未定义的问题。

内容的提问来源于stack exchange,提问作者pSyToR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:45:28