electron中使用lowdb指定存储位置进行数据本地持久化存储

介绍了lowdb的使用方法,针对主进程和渲染进程数据不同步问题给出解决方案。在无额外处理时,两进程操作的是db的不同拷贝。可在每个db操作前用read()刷新内存区,也可通过electron进程间通信,让渲染进程通知主进程设置新数据。

lowdb使用方法

const low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync'); // 同步模块
const Memory = require('lowdb/adapters/Memory'); // 存入内存
const path = require('path');
const fs = require('fs-extra'); 
const os = require('os');
const { remote, app } = require('electron');

// 渲染进程和主进程兼容
const APP = process.type === 'renderer' ? remote.app : app; 

// 本地路径一项目目录
// const adapter = new FileSync('datastore.json')
// const STORE_PATH = APP.getAppPath('userData') // 获取electron应用的用户目录
// if (process.type !== 'renderer') {
  // if (!fs.pathExistsSync(STORE_PATH)) {
    // fs.mkdirpSync(STORE_PATH);
  // }
// }

// 本地路径二项目目录
// const adapter = new FileSync(path.join(__dirname, '/datastore.json')) // 初始化lowdb读写的json文件名以及存储路径

// 本地路径三,系统目录
const adapter = new FileSync(path.join(os.homedir(), 'datastore.json')); // 存储在本地目录

let db = low(adapter)

db.defaults({ info: {}, isActivated: false }).write();
db.set('info', {name: 'guo', desc: '前端工程师'}).write()
let appInfo = db.get('info').value();
console.log('db', appInfo);

module.exports = db; //模块导出,可在其它js文件中引用

如果主进程和渲染进程的数据不同步,因为在没有额外处理的情况下,main进程和renderer进程不是一个db的两份引用,而是一个db的两份拷贝,两个进程操作的是不同的db

可以这样写:

db.read().get('xxx').value()
db.read().set('xxx', 'xxx')

强制在每个db操作前,都通过read()刷新一遍内存区,这样就能保证拿到的数据都是最新的啦。

也可以通过electron进程间通信的方法,渲染进程在设置了新数据后通知主进程再进行一次设置


// renderer进程
db.set('info', data).write();
ipcMain.send('info', 'xxx');

// main主进程
ipcMain.on('info', (event, arg) => {
  console.log('主进程',arg);
  db.set('info', 'xxx').write();
});
<think>我们正在讨论Electron中Chrome运行时的数据存储位置。根据之前的知识,我们知道Electron应用默认使用独立的用户数据目录来存储缓存、Cookies、本地存储数据。现在用户特别询问运行过程中数据存储位置,我们需要结合引用内容来回答。 引用[1]提到Electron应用的安全性,特别是用户数据目录的位置和Node.js集成的影响。虽然没有直接给出存储路径,但强调了默认情况下每个应用有自己的用户数据目录。 引用[2]是用户的学习笔记,与问题无关。 引用[3]指向electron-builder仓库,与存储位置无关。 因此,我们主要依靠自己的知识和引用[1]的上下文来回答。 关键点: 1. Electron使用Chromium作为渲染引擎,因此存储机制与Chrome类似,但每个Electron应用默认有自己的用户数据目录(userData)。 2. 存储位置取决于操作系统和应用程序名称。 具体路径如下: - Windows: `%APPDATA%\<app-name>` - macOS: `~/Library/Application Support/<app-name>` - Linux: `~/.config/<app-name>` 或 `$XDG_CONFIG_HOME/<app-name>` 在这个目录下,会包含多个子目录和文件,例如: - Cache: 缓存文件 - Cookies: Cookies数据库 - Local Storage: 本地存储数据 - IndexedDB: 索引数据库 - etc. 另外,用户也可以通过代码来获取和修改这个路径: - 在主进程中,`app.getPath('userData')` 可以获取当前应用的用户数据目录路径。 注意:如果应用在启动时通过命令行参数`--user-data-dir`指定了自定义目录,那么数据存储在该指定目录。 我们还可以引用[1]中关于安全性的内容:由于数据存储在同一目录下,如果应用存在安全漏洞(如CSP配置不当或使用有漏洞的组件),攻击者可能读取或篡改这些数据。因此,保护这个目录也很重要。 现在,我们可以组织答案了。 </think> Electron 应用在运行时使用的 Chrome 数据存储位置主要由 **用户数据目录(User Data Directory)** 决定,该目录的路径结构如下[^1]: ### 一、默认存储位置(按操作系统) | 操作系统 | 默认路径格式 | |---------|-------------| | **Windows** | `%APPDATA%\<应用名>\`<br>(例如:`C:\Users\<用户名>\AppData\Roaming\MyElectronApp\`) | | **macOS** | `~/Library/Application Support/<应用名>/`<br>(例如:`/Users/<用户名>/Library/Application Support/MyElectronApp/`) | | **Linux** | `~/.config/<应用名>/`<br>或 `$XDG_CONFIG_HOME/<应用名>/` | > 可通过 `app.getPath('userData')` 获取完整路径 --- ### 二、目录核心结构 ```bash userData/ ├── Cache/ # 磁盘缓存(网络资源、页面片段) ├── Cookies # Cookie 数据库 ├── Local Storage/ # localStorage 数据 ├── IndexedDB/ # IndexedDB 数据库 ├── Session Storage/ # 会话级存储 ├── GPUCache/ # GPU 缓存 └── Partitions/ # 会话分区数据(如果启用) ``` --- ### 三、关键存储机制 1. **隔离性** 每个 Electron 应用默认使用**独立目录**,不同应用的数据完全隔离(除非强制指定相同路径)[^1]。 2. **自定义路径** 可通过以下方式覆盖默认路径: ```javascript // 主进程中设置 app.setPath('userData', '/custom/path') ``` 或启动参数: ```bash electron --user-data-dir=/shared/path ``` 3. **会话分区** 若创建窗口时指定 `partition`,数据存储在子目录: ```javascript new BrowserWindow({ webPreferences: { partition: 'persist:my-partition' // → 存储在 Partitions/my-partition/ } }) ``` --- ### 四、安全注意事项 1. **漏洞风险** 如果应用存在 CSP 配置缺陷或使用有漏洞的组件,攻击者可能读取/篡改该目录数据。 2. **保护建议** - 启用严格 CSP 策略 - 定期清理敏感缓存: ```javascript session.defaultSession.clearCache() ``` - 避免将 `nodeIntegration` 设为 `true` ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值