Почему 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?