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

如何在Express中将本地JSON文件作为内存初始资源?

内存中Todo数据持久化(避免每次重置)的解决方案

核心思路是把初始JSON数据一次性加载到内存变量中,后续所有操作都直接操作这个变量,不再重复读取文件,这样内存中的修改就能保留下来,直到应用重启。

修改后的代码示例:

import { readFile } from 'fs/promises';

// 用全局变量缓存Todo数据,仅初始化一次
let todos = null;

// 仅在首次调用时读取JSON文件,之后直接返回缓存的内存数据
const initializeTodos = async () => {
  if (!todos) {
    todos = JSON.parse(
      await readFile(process.cwd() + '/src/resources/todo/todo.json', 'utf-8')
    );
  }
  return todos;
};

// 必须在应用启动时提前执行初始化(比如在Express入口文件中)
// 示例:在app.js中添加 await initializeTodos(); 再启动服务器

export const getTodos = () => {
  if (!todos) {
    throw new Error('请先执行initializeTodos初始化Todo数据');
  }
  return todos;
};

// 示例CRUD操作函数,直接操作内存中的todos变量
export const addTodo = (newTodo) => {
  const currentTodos = getTodos();
  const todoWithId = { id: Date.now(), ...newTodo };
  currentTodos.push(todoWithId);
  return todoWithId;
};

export const updateTodo = (todoId, updatedFields) => {
  const currentTodos = getTodos();
  const targetTodo = currentTodos.find(todo => todo.id === todoId);
  if (targetTodo) {
    Object.assign(targetTodo, updatedFields);
    return targetTodo;
  }
  return null;
};

export const deleteTodo = (todoId) => {
  const currentTodos = getTodos();
  const initialCount = currentTodos.length;
  // 直接过滤修改原数组(或者重新赋值,这里根据你的需求调整)
  todos = currentTodos.filter(todo => todo.id !== todoId);
  return initialCount !== todos.length;
};

关键说明:

  1. 缓存机制:用let todos作为内存容器,initializeTodos只会在todos为null时读取JSON文件,后续调用直接返回缓存数据。
  2. 提前初始化:一定要在应用启动阶段(比如Express服务器启动前)调用await initializeTodos(),确保所有路由处理器调用getTodos时数据已经加载完成。
  3. 修改保留:所有CRUD操作直接修改内存中的todos变量,修改会一直保留到应用重启(重启后会重新加载初始JSON数据)。

注意事项:

  • 这种方案下,应用重启后内存中的修改会丢失,完全符合你“仅在内存中操作”的需求;如果之后需要持久化,再添加写入文件的逻辑即可。
  • 可以根据实际需求调整CRUD函数的实现,比如添加id校验、字段验证等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:35:18