sja*_*rni 5 javascript windows node.js lokijs vuex
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')
}
}
Run Code Online (Sandbox Code Playgroud)
setupHandler每次应用程序启动时调用它,database.json与各自的集合,以database.json.0和database.json.1为ads和profilesaddAd()被调用时,它可以通过调用正确地访问所有数据db.getCollection('ads'),然后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创建了此运行,则应用程序行为正常,insert()似乎可以正常工作,但是,退出时不会保存任何数据,并且连续运行会导致上述行为中的行为.这是LokiJS/Vuex深处的一个错误,还是只是我滥用他们的API?