Electron中nedb-promises存储文件每次启动被替换问题求助
Electron中使用nedb-promises重启后数据库文件被清空
问题核心
使用nedb-promises@6.2.1时,数据能正常写入并在当前会话中读取,但应用重启后数据库文件被替换为空,开发/生产环境均存在该问题。
排查方向与解决方案
1. 确保数据库存放目录存在
nedb不会自动创建数据库文件所在的目录,如果data目录不存在,初始化时会直接创建新的空文件,而非加载已有文件。修改db.js,添加目录预创建逻辑:
const { app } = require('electron'); const Datastore = require('nedb-promises'); const fs = require('fs').promises; const path = require('path'); const getDbPath = async (fileName) => { // 确定数据库根目录:开发环境用项目下的data,生产环境用Electron的userData目录 const baseDir = process.env.NODE_ENV === 'development' ? path.join(__dirname, 'data') : path.join(app.getPath('userData'), 'data'); // 递归创建目录(如果不存在) await fs.mkdir(baseDir, { recursive: true }); return path.join(baseDir, fileName); }; const dbFactory = async (fileName) => { const filePath = await getDbPath(fileName); const store = Datastore.create({ filename: filePath, timestampData: true, autoload: true }); // 监听加载错误,排查问题 store.on('load', (err) => { if (err) console.error(`加载${fileName}失败:`, err); }); return store; }; // 异步初始化数据库,避免提前调用未就绪的资源 let db; const initDb = async () => { db = { customers: await dbFactory('customers.db'), tasks: await dbFactory('tasks.db') }; }; module.exports = { initDb, getDb: () => db };
2. 调整数据库初始化时机
Electron的app.getPath('userData')必须在app ready事件触发后调用,否则会返回错误路径,导致数据库文件存放在错误位置,重启后加载空文件。在主进程中等待app就绪后再初始化数据库:
const { app, ipcMain } = require('electron'); const { initDb, getDb } = require('./db'); app.whenReady().then(async () => { // 先初始化数据库 await initDb(); // 注册IPC事件 ipcMain.handle('Elements:Get', async (event, args) => { const data = await getDb().customers.find({}); console.log(data); return data; }); ipcMain.handle('Element:Save', async (event, data) => { try { const newDoc = await getDb().customers.insertOne(data.item); console.log(newDoc); return newDoc; } catch (err) { console.log("添加数据失败"); console.log(err); throw err; // 抛出错误让渲染进程捕获 } }); });
3. 检查文件权限与数据完整性
- 生产环境下,确认应用对
userData目录拥有读写权限 - 手动检查数据库文件是否有损坏,可尝试删除现有空文件后重新测试
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

