为什么LokiSFSAdapter适用于Linux,而不适用于Windows?

时间:2018-01-21 11:23:54

标签: javascript node.js windows vuex lokijs

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的{​​{1}}和database.json.1以及ads
  • 的相应馆藏
  • 调用profiles时,可以通过调用addAd(),然后调用db.getCollection('ads')来正确访问所有数据。

Windows上的行为

    如果insert()不存在,则
  • 仅调用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似乎可以正常工作,但是,退出时不保存任何数据,并且连续运行会导致上述行为中的行为。 / LI>

问题

这是LokiJS / Vuex深处的一个错误,还是我误用了他们的API?

0 个答案:

没有答案