vue.js - NeDB(使用 Vue-Electron)无法保存本地数据库文件
问题描述
我正在使用 NeDB 开发 Vue-Electron。在使用 NeDB 时,我遇到了 NeDB 不保存本地文件的问题,尽管我设置了选项filename
和autoload: true
.
我在加载 NeDB 时尝试了 db 对象的输出日志,它正确设置了路径。
Datastore {inMemoryOnly: false,
autoload: true,
timestampData: false,
filename: "./db/nedb.db",
compareStrings: undefined, …}
autoload: (...)compareStrings: (...)
executor: Executorfilename: "./db/nedb.db"
inMemoryOnly: falseindexes: Objectpersistence: PersistencetimestampData: ...
我看到了其他帖子。但我不知道如何Then in the renderer process get the datastore via Electron.Remote
在 Electron 应用程序中进行 NEDB 持久性
我认为这可能会发生,因为 NeDB 在运行脚本之前需要文件存在。所以我尝试touch nedb.db
了,但没有奏效。
此外,其他奇怪的事情:我有另一个使用 NeDB 的 Vue 应用程序,并且数据显示。但我没有在该应用程序中设置数据库路径。此应用程序插入的数据在其他应用程序的 db 文件中不存在。
下面是我的代码。如果有人可以帮助我。谢谢。
const remote = require('electron').remote;
const app = remote.app;
const path = require('path');
var db = new nedb({
//filename: path.join(app.getPath('userData'), 'library.db'),
filename: './db/nedb.db',
autoload: true
});
let doc = {
dev: true,
message: 'test'
}
db.insert(doc);
db.find({}, function (err, docs) {
console.log(docs)
console.log(err)
})
解决方案
renderer
如果从进程中调用,NeDB 将默认使用浏览器存储 (IndexedDB) 。如果在main
进程中创建,它将创建文件。 请参阅 github 上的这篇文章。
从帖子:
Nedb 让您使用此调用创建一个新的自动加载数据存储:
let db = new Datastore({ filename: 'path/to/datafile', autoload: true });
然而,这个命令似乎只有在从主进程执行时才是准确的(对于新的 Electron 开发人员,这通常是你的 main.ts 或 main.js 文件)。
如果您从在渲染器进程中执行的类(在 BrowserWindow 中执行的任何类)执行数据存储创建命令,则 nedb 会忽略您提供的数据文件并在 IndexedDB 中创建数据库。您将在应用程序的“userData”目录中找到您的数据库(请参阅您的操作系统的文档)从主进程中删除,...文件)。
- 从主进程创建数据文件(在 main.ts 中):
let collectionsDb: Datastore = new Datastore({ filename: path.join(app.getPath("userData"), "Collections.db"), autoload: true });
- 将 db 变量放入主进程中的全局变量中(在 main.ts 中):
const globalAny:any = global;
globalAny.collectionsDb = collectionsDb;
通过调用全局 db 变量从渲染进程访问全局 db 变量: import { remote } from 'electron';
private db = remote.getGlobal('collectionDb');
另请参阅对 OP 引用的问题的答案。
推荐阅读
- android - MediaPlayer 未在 RecyclerView 中停止
- delphi - 如何在新的 Delphi TEdgeBrowser 中设置用户代理?
- python - 我可以创建一个只到达 px.scatter 中最低点的条形轨迹吗?
- javascript - 如何定位getBoundingClientRect,所以它不返回null?
- pandas - Pandas multiindex unstack fillna 不工作
- dataset - 当我尝试在 for 循环中进行子集化时,为什么我的代码会返回所有记录 - R?
- laravel - Laravel Slack 通知响应
- sql - SQL:是否可以在 varchar 列中选择最后一个分隔符之后的子字符串
- python - 我应该如何在我的 tkinter 应用程序中添加分隔符,或者我应该如何使用 pack() 函数使项目形成垂直列
- excel - VBA 或 Excel 公式循环使用多个条件的多个值