如何在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; };
关键说明:
- 缓存机制:用
let todos作为内存容器,initializeTodos只会在todos为null时读取JSON文件,后续调用直接返回缓存数据。 - 提前初始化:一定要在应用启动阶段(比如Express服务器启动前)调用
await initializeTodos(),确保所有路由处理器调用getTodos时数据已经加载完成。 - 修改保留:所有CRUD操作直接修改内存中的
todos变量,修改会一直保留到应用重启(重启后会重新加载初始JSON数据)。
注意事项:
- 这种方案下,应用重启后内存中的修改会丢失,完全符合你“仅在内存中操作”的需求;如果之后需要持久化,再添加写入文件的逻辑即可。
- 可以根据实际需求调整CRUD函数的实现,比如添加id校验、字段验证等。
内容的提问来源于stack exchange,提问作者Joji
相关产品推荐
相关产品推荐

