我一直在搜索 Electron 文档,尝试找出如何在 Electron 应用程序中保存数据。例如,在 iOS 或 OS X 中,您可以使用 NSUserDefaults 来存储用户设置和首选项。我想做类似的事情。如何在 Electron 应用程序中保存数据?
NeDB 是目前 Electron 唯一推荐或推荐的作为 Electron 嵌入式持久数据库的工具。 - http:// Electron.atom.io/community/
如果设置很复杂,存储用户设置也很有用。
Node.js、nw.js、Electron 的嵌入式持久数据库或内存数据库 和浏览器,100% JavaScript,无二进制依赖。 API 是一个子集 MongoDB 的,而且速度非常快。 - NeDB
创建或加载数据库:
var Datastore = require('nedb')
, db = new Datastore({ filename: 'path/to/datafile', autoload: true });
// You can issue commands right away
插入文档:
var doc = { hello: 'world'
, n: 5
, today: new Date()
, nedbIsAwesome: true
, notthere: null
, notToBeSaved: undefined // Will not be saved
, fruits: [ 'apple', 'orange', 'pear' ]
, infos: { name: 'nedb' }
};
db.insert(doc, function (err, newDoc) { // Callback is optional
// newDoc is the newly inserted document, including its _id
// newDoc has no key called notToBeSaved since its value was undefined
});
查找文档:
// Finding all inhabited planets in the solar system
db.find({ system: 'solar', inhabited: true }, function (err, docs) {
// docs is an array containing document Earth only
});
这样的例子还在继续......
截至 2019 年,这不再是有效的答案。请参阅下面 @jviotti 和 @Tharanga 的答案。
我编写了一个名为 electron-json-storage 的 NPM 模块,旨在将其抽象出来并为开发人员提供一个漂亮且简单的界面。
模块在内部读取/写入 JSON
app.getPath('userData')
:
const storage = require('electron-json-storage');
// Write
storage.set('foobar', { foo: 'bar' }, function() {
// Read
storage.get('foobar', function(error, object) {
if (error) throw error
console.log(object.foo);
// will print "bar"
});
});
elecron 中有一个很好的模块用于存储用户数据。它被称为电子商店。
安装
$ npm install electron-store
示例用法(从github页面复制)
const Store = require('electron-store');
const store = new Store();
store.set('unicorn', '🦄');
console.log(store.get('unicorn'));
//=> '🦄'
// Use dot-notation to access nested properties
store.set('foo.bar', true);
console.log(store.get('foo'));
//=> {bar: true}
store.delete('unicorn');
console.log(store.get('unicorn'));
//=> undefined
这个模块有很多功能,并且比window.localStorage有很多优点
除了其他答案中提到的之外,您还有多种选择。
如果您想将数据存储在 SQL 数据库中,那么您可以 https://github.com/mapbox/node-sqlite3
或者如果您要存储配置,您可以直接存储在操作系统的
userData
存储中。
const electron = require('electron');
const fs = require('fs');
const path = require('path');
const dataPath = electron.app.getPath('userData');
const filePath = path.join(dataPath, 'config.json');
function writeData(key, value){
let contents = parseData()
contents[key] = value;
fs.writeFileSync(filePath, JSON.stringify(contents));
}
function readData(key, value) {
let contents = parseData()
return contents[key]
}
function parseData(){
const defaultData = {}
try {
return JSON.parse(fs.readFileSync(filePath));
} catch(error) {
return defaultData;
}
}
Electron 视图是使用 Webkit 构建的,它使您可以访问基于 Web 的本地存储 api。适合简单易用的设置存储。
如果您需要更强大的功能或需要从主脚本访问存储,您可以使用众多基于节点的存储模块之一。我个人喜欢lowdb。
对于大多数节点存储模块,您将需要提供文件位置。尝试:
var app = require('app');
app.getPath('userData');
有一个模块提供了简单的方法来获取和设置 json 文件到此目录,如果需要的话创建子目录并支持回调和承诺:
https://github.com/ran-y/electron-storage
自述:
安装
$ npm install --save electron-storage
用法
const storage = require('electron-storage');
API
storage.get(filePath, cb)
storage.get(filePath, (err, data) => {
if (err) {
console.error(err)
} else {
console.log(data);
}
});
storage.get(文件路径)
storage.get(filePath)
.then(data => {
console.log(data);
})
.catch(err => {
console.error(err);
});
storage.set(文件路径,数据,cb)
storage.set(filePath, data, (err) => {
if (err) {
console.error(err)
}
});
storage.set(文件路径, 数据)
storage.set(filePath, data)
.then(data => {
console.log(data);
})
.catch(err => {
console.error(err);
});
storage.isPathExists(路径, cb)
storage.isPathExists(path, (itDoes) => {
if (itDoes) {
console.log('pathDoesExists !')
}
});
storage.isPathExists(路径)
storage.isPathExists(path)
.then(itDoes => {
if (itDoes) {
console.log('pathDoesExists !')
}
});
您可以选择 Indexeddb,它很可能适合客户端应用程序的需求,因为:
总而言之,这是一个不错的选择。唯一需要注意的是,如果未设置
navigator.storage.persist
,或者当主机崩溃而使 indexeddb 处于损坏状态时,Chromium 核心可能会自动清除 indexeddb 以回收磁盘空间。
Electron 中可以使用多种数据持久化方法,选择正确的方法主要取决于您的用例。如果只是保存应用程序设置,那么您可以使用简单的机制,例如平面文件或 HTML5 存储 API,对于高级数据要求,您应该选择大型数据库解决方案,例如 MySQL 或 MongoDB(带或不带 ORM)。
您可以检查此方法/工具列表,以在 Electron 应用程序中保存数据