NeDB(使用Vue-Electron)无法保存本地数据库文件

时间:2018-10-19 22:46:48

标签: vue.js electron nedb

我正在与NeDB合作开发Vue-Electron。 使用NeDB时,我遇到了以下问题:即使我设置了选项filenameautoload: true,NeDB也不保存本地文件。

我在加载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 NEDB persistance in Electron app

我认为可能会发生,因为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)
})

1 个答案:

答案 0 :(得分:0)

如果从renderer进程调用,NeDB将默认为浏览器存储(IndexedDB)。如果在main进程中创建,它将创建文件。 See this post on github.

摘自帖子:

  

Nedb让您使用此调用创建一个新的自动加载数据存储:

     

let db = new Datastore({ filename: 'path/to/datafile', autoload: true });

     

但是,此命令似乎仅在执行时才正确   从主要过程(对于新的Electron开发人员,通常是   您的main.ts或main.js文件)。

     

如果从渲染器进程中执行的类(在BrowserWindow中执行的任何类)执行数据存储创建命令,则nedb会忽略您提供的数据文件,而是在IndexedDB中创建数据库。您将在应用程序的“ userData”目录中找到数据库(请参见操作系统的文档)   如果您确实希望nedb创建并使用在数据存储创建期间提供的数据库文件,则必须从主流程中创建并访问数据文件(添加,删除,...文档)。

     
      
  1. 从主进程创建数据文件(在main.ts中):
  2.   
     

let collectionsDb: Datastore = new Datastore({ filename: path.join(app.getPath("userData"), "Collections.db"), autoload: true });

     
      
  1. 将db变量放入主进程的全局变量中(在main.ts中):
  2.   
     

const globalAny:any = global;

     

globalAny.collectionsDb = collectionsDb;

     

通过调用全局db变量从渲染器进程访问全局db变量:   从“电子”导入{远程};

     

private db = remote.getGlobal('collectionDb');

另请参阅this answer,以了解OP所引用的问题。