NeDB (с Vue-Electron) не удалось сохранить файл локальной БД - PullRequest
0 голосов
/ 20 октября 2018

Я занимаюсь разработкой Vue-Electron с NeDB.При использовании NeDB я столкнулся с проблемой, что NeDB не сохраняет локальный файл, хотя я установил опцию filename и autoload: true.

Я попытался вывести журнал объекта db при загрузке NeDB, он установил правильный путь.

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 в приложении Electron

Я подумал, что это может произойти, потому что файл NeDB должен существовать до запуска скрипта.Поэтому я попытался touch nedb.db, но это не сработало.

Более того, еще одна странная вещь: у меня есть другое приложение Vue, которое использует NeDB, и данные показали.Но я не устанавливаю путь базы данных в этом приложении.Вставленные данные этим приложением не существуют в файле базы данных другого приложения.

Ниже приведен мой код.Если бы кто-то мог мне помочь.Спасибо.

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 голосов
/ 31 декабря 2018

NeDB по умолчанию будет храниться в браузере (IndexedDB) при вызове из процесса renderer.Если он создан в процессе main, он создаст файл. Смотрите этот пост на github.

Из поста:

Недб, давайте создадим новое автозагрузочное хранилище данных с помощью этого вызова:

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

Однако представляется, что эта команда является точной только при выполнении из основного процесса (для новых разработчиков Electron это обычно ваш файл main.ts или main.js).

Если вы выполняете команду создания хранилища данных из класса, который выполняется в процессе визуализации (любой класс, который выполняется в BrowserWindow), nedb игнорирует предоставленный вами файл данных и вместо этого создает базу данных в IndexedDB.Вы найдете свою базу данных в каталоге «userData» вашего приложения (см. Документацию для вашей ОС). Если вы действительно хотите, чтобы nedb создавал и использовал файл базы данных, предоставленный вами при создании хранилища данных, вы должны создать И получить доступ к файлу данных (добавить,удалить ... документы) из основного процесса.

  1. Создание файла данных из основного процесса (в 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');

См. также этот ответ на вопрос, на который ссылается ФП.

...