5

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.0database.json.1adsprofiles
  • 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?

4

0 回答 0