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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:35:19