programing

LokiSFSAdapter는 Linux에서는 동작하지만 Windows에서는 동작하지 않는 이유는 무엇입니까?

bestcode 2022. 7. 16. 15:11
반응형

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

반응형