Javascript 为什么LokiSFSAdapter可以在Linux上工作,而不能在Windows上工作?
TL;DR一段Javascript代码在Linux上完美地工作,而在Windows上的行为却不一致Javascript 为什么LokiSFSAdapter可以在Linux上工作,而不能在Windows上工作?,javascript,node.js,windows,vuex,lokijs,Javascript,Node.js,Windows,Vuex,Lokijs,TL;DR一段Javascript代码在Linux上完美地工作,而在Windows上的行为却不一致 我正在编写一个电子应用程序,使用Vue.js作为前端,Vuex用于数据管理,LokiJS用于持久性存储(在后台使用其文件系统适配器)。我在Linux上开发这个应用程序,但有时我不得不切换到Windows来为客户端创建Windows版本。Linux版本总是完美无瑕地工作,而Windows版本则表现不佳。我认为这是一个LokiJS问题,但是,在隔离了特定于LokiJS的代码之后,它甚至可以在Wind
我正在编写一个电子应用程序,使用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()
- 仅当
不存在时调用数据库.json
。但是,如果数据库不存在,它会正确地创建setupHandler
database.json
- 只创建一个文件-
,但不在其中保存任何数据,它只是一个空文件。它甚至不为第二个集合创建database.json.0
database.json.1
- 显然,由于没有实际保存任何数据,
并返回db.getCollection('ads')
,这导致null
TypeError:在连续运行应用程序时调用
时无法读取null的属性“insert”addAd()
- 如果创建了此运行
,则应用程序的行为正常,database.json
似乎可以工作,但是,退出时不会保存任何数据,连续运行会导致上述行为insert()
这是LokiJS/Vuex深处的一个bug,还是只是我误用了他们的API?运行所有“东西”的进程是否对目录具有适当的权限?那么,您数据库的文件系统适配器进程是否有权限写入特定的选定文件夹等?@Tschallacka当然有权限,因为它能够在创建
database.json的目录中正确地创建database.json.0
,等等。如果调用saveDatabases()
直接在调用setupHandler()
之后?它是否会触发任何错误、系统日志等。。?windows日志说明了什么?(开始菜单
事件查看器
)@Tschallacka我无法在autoloadCallback之后直接调用任何内容,因为我无法控制调用它的时间。但是,如果我创建一个专用回调函数,在该函数中调用setupHandler,然后调用db.saveDatabase,它的行为方式与以前相同。如果我将错误回调传入db.saveDatabase(),它甚至不会被调用。此外,错误日志中没有任何内容