반응형
LokiSFSAdapter는 Linux에서는 동작하지만 Windows에서는 동작하지 않는 이유는 무엇입니까?
TL;DR Javascript 코드 조각은 Linux에서 완벽하게 작동하지만 Windows에서는 일관되지 않습니다.
프론트엔드의 Vue.js, 데이터 관리의 Vuex, 영속 스토리지의 LokiJs를 사용하여 Electron 앱을 코딩하고 있습니다(배경에 파일 시스템 어댑터를 두고).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
하지만 그게 존재하지 않는다면요. - 파일을 1개만 만듭니다.
database.json.0
데이터는 저장되지 않고 빈 파일일 뿐입니다.그런다고 뭐가 달라지지도 않고database.json.1
두 번째 컬렉션에 대해서요. - 데이터가 실제로 저장되지 않기 때문에
db.getCollection('ads')
및 반환null
그 결과,TypeError: Cannot read property 'insert' of null
전화할 때addAd()
연속적으로 실행되는 어플리케이션의 경우. - 이것이 실행되면
database.json
어플리케이션이 정상적으로 동작하고 있다.insert()
단, 종료 시 데이터가 저장되지 않으며 연속 실행 시 위의 포인트에서 동작이 발생합니다.
질문.
이것은 LokiJS/Vuex의 깊은 곳에 있는 버그입니까?아니면 제가 그들의 API를 잘못 사용하고 있는 것일까요?
언급URL : https://stackoverflow.com/questions/48366236/why-does-lokisfsadapter-work-on-linux-but-not-on-windows
반응형
'programing' 카테고리의 다른 글
Vue.js에서 계산된 속성을 테스트하는 방법"데이터"를 조롱할 수 없음 (0) | 2022.07.16 |
---|---|
vuetify 구성 요소에 대한 파급 효과 전역 사용 안 함 (0) | 2022.07.16 |
Vue prop 유형 유효성 검사 개체 스키마 (0) | 2022.07.16 |
휴지 상태 - 소유 엔티티 인스턴스에서 캐스케이드="all-delete-module" 컬렉션을 더 이상 참조하지 않습니다. (0) | 2022.07.16 |
커스텀 dev/prod 서버에서 vue cli 서비스 기능을 활용하는 방법 (0) | 2022.07.16 |