Почему LokiSFSAdapter работает в Linux, но не в Windows?

TL;DR Часть кода Javascript работает безупречно в Linux, в то время как в Windows ведет себя непоследовательно.


Я кодирую приложение Electron, используя Vue.js для внешнего интерфейса, Vuex для управления данными и LokiJS для постоянного хранения (с адаптером файловой системы на заднем плане). Я разрабатываю это приложение для Linux, но время от времени мне приходится переключаться на Windows, чтобы создать сборку Windows для клиента. Сборка Linux всегда работает безупречно, Windows ведёт себя плохо. Я предположил, что это проблема LokiJS, однако после изоляции кода, специфичного для LokiJS, он работал правильно даже в Windows.

Вот упрощенно store.js файл, который содержит весь соответствующий код Vuex и LokiJS в моем приложении.

import loki from 'lokijs'
import LokiSFSAdapter from 'lokijs/src/loki-fs-structured-adapter'
import MainState from '../index' // a Vuex.Store object

const state = {
  ads: [],
  profiles: []
}

var sfsAdapter = new LokiSFSAdapter('loki')
var db = new loki('database.json', {
  autoupdate: true,
  autoload: true,
  autoloadCallback: setupHandler,
  adapter: sfsAdapter
})

function setupCollection (collectionName) {
  var collection = db.getCollection(collectionName)
  if (collection === null) {
    collection = db.addCollection(collectionName)
  }
}

function setupHandler () {
  setupCollection('ads')
  setupCollection('profiles')

  MainState.commit('updateAds')
  MainState.commit('updateProfiles')
}

window.onbeforeunload = function () {
  db.saveDatabase()
  db.close()
}

const mutations = {
  updateAds (state) {
    state.ads = db.getCollection('ads').data.slice()
  },
  updateProfiles (state) {
    state.profiles = db.getCollection('profiles').data.slice()
  }
}

const actions = {
  async addProfile (context) {
    db.getCollection('profiles').insert({ /* default data */ })
    db.saveDatabase()
    context.commit('updateProfiles')
  },
  async updateProfile (context, obj) {
    db.getCollection('profiles').update(obj)
    db.saveDatabase()
    context.commit('updateProfiles')
  },
  async deleteProfile (context, id) {
    db.getCollection('profiles').removeWhere({'$loki': {'$eq': id}})
    db.saveDatabase()
    context.commit('updateProfiles')
  },
  async addAd (context) {
    db.getCollection('ads').insert({ /* default data */ })
    db.saveDatabase()
    context.commit('updateAds')
  },
  async deleteAd (context, id) {
    db.getCollection('ads').removeWhere({'$loki': {'$eq': id}})
    db.saveDatabase()
    context.commit('updateAds')
  }
}

Поведение в Linux

  • это вызывает setupHandler каждый раз, когда приложение запускается,
  • он правильно сохраняет данные в database.json и соответствующие коллекции database.json.0 а также database.json.1 за ads а также profiles
  • когда addAd() называется, он может получить доступ ко всем данным должным образом, вызвав db.getCollection('ads'), а потом insert() в теме.

Поведение в Windows

  • только звонки setupHandler если database.json не существует Это правильно создает database.json если он не существует, хотя
  • создает только один файл - database.json.0, но не сохраняет никаких данных там, это просто пустой файл. Это даже не создает database.json.1 для второй коллекции.
  • очевидно, поскольку данные на самом деле не сохраняются, db.getCollection('ads') и возвращается nullчто приводит к TypeError: Cannot read property 'insert' of null при звонке addAd() на последовательных приложениях работает.
  • если это запустить database.json было создано, приложение ведет себя нормально, insert() похоже, работает, однако, никакие данные не сохраняются при выходе, и последовательные запуски приводят к поведению в точке выше.

Вопрос

Это ошибка где-то глубоко в LokiJS/Vuex, или я просто неправильно использую их API?

0 ответов

Другие вопросы по тегам