如何在ExpressJS应用中使用NeDB将对象集合存储为JSON数组格式?
在ExpressJS中使用NeDB将数据存储为JSON数组的解决方案
首先得跟你澄清一个关键点:你看到的这种每行一个JSON对象的格式,其实是NeDB默认采用的行分隔JSON(Line Delimited JSON),这是NeDB专门设计的存储格式,并不是无效的JSON——NeDB内部完全可以正常解析、查询和操作这些数据,所以如果只是用NeDB来处理订单数据,其实不需要修改这种格式。
但如果你的需求确实是要让存储文件是标准的JSON数组(比如需要其他外部工具读取这个文件),那NeDB本身没有直接提供这个配置选项,不过可以通过两种方式实现:
方法一:手动封装数组存储逻辑
放弃NeDB的原生文件持久化,自己通过文件系统API来维护一个JSON数组:
const fs = require('fs').promises; const path = require('path'); // 定义订单文件路径 const ORDERS_FILE = path.join(__dirname, 'orders.json'); // 初始化订单文件:如果文件不存在则创建空数组 async function initOrdersFile() { try { await fs.access(ORDERS_FILE); } catch { await fs.writeFile(ORDERS_FILE, JSON.stringify([])); } } // 生成唯一ID的工具函数(模拟NeDB的_id逻辑) function generateUniqueId() { return Date.now().toString(36) + Math.random().toString(36).slice(2); } // 插入订单到数组 async function insertOrder(order) { await initOrdersFile(); // 读取现有订单数组 const rawData = await fs.readFile(ORDERS_FILE, 'utf8'); const orders = JSON.parse(rawData); // 添加唯一ID并推入数组 order._id = generateUniqueId(); orders.push(order); // 写回文件 await fs.writeFile(ORDERS_FILE, JSON.stringify(orders, null, 2)); return order; } // 使用示例 const order = { chatId: 4324234, url: 'https://google.com', maxPrice: 200, incrementPrice: 2, expiryHours: 24, timestamp: Date.now() }; insertOrder(order); insertOrder(order);
这种方法适合数据量不大的场景,因为每次插入都需要读取整个文件,数据量过大时性能会受影响。
方法二:NeDB内存模式+定期导出数组
先用NeDB的内存模式处理数据(享受NeDB的查询、更新等便利API),然后定期将数据库中的所有数据导出为JSON数组格式的文件:
const Datastore = require('nedb'); const fs = require('fs').promises; const path = require('path'); // 创建内存版NeDB实例 const ordersDb = new Datastore(); const ORDERS_FILE = path.join(__dirname, 'orders.json'); // 启动时从文件加载现有订单数组 async function loadExistingOrders() { try { const rawData = await fs.readFile(ORDERS_FILE, 'utf8'); const ordersArray = JSON.parse(rawData); // 将数组中的数据批量插入内存数据库 ordersDb.insert(ordersArray); } catch { // 文件不存在则跳过,数据库初始为空 } } // 将内存数据库中的所有数据导出为JSON数组 async function exportOrdersToFile() { const allOrders = await new Promise((resolve, reject) => { ordersDb.find({}, (err, docs) => { if (err) reject(err); else resolve(docs); }); }); await fs.writeFile(ORDERS_FILE, JSON.stringify(allOrders, null, 2)); } // 初始化加载数据 loadExistingOrders(); // 插入订单后立即导出 const order = { chatId: 4324234, url: 'https://google.com', maxPrice: 200, incrementPrice: 2, expiryHours: 24, timestamp: Date.now() }; ordersDb.insert(order, async (err) => { if (!err) await exportOrdersToFile(); }); ordersDb.insert(order, async (err) => { if (!err) await exportOrdersToFile(); }); // 可选:设置定时导出,比如每分钟自动保存一次,避免意外丢失数据 setInterval(exportOrdersToFile, 60000);
这种方法兼顾了NeDB的便捷性和你需要的数组格式存储,适合需要频繁查询或修改订单数据的场景。
内容的提问来源于stack exchange,提问作者AbdelHajou
相关产品推荐
相关产品推荐

