Electronでlowdbを使ってローカルのjsonファイルを読み書きしていたのですが、開発時は問題なく動いていたのにパッケージングしたアプリケーションではEACCESS permission denied
と実行時エラーになりました。
const low = require('lowdb')
const storage = require('lowdb/file-sync')
const db = low('db.json', { storage }) // permission denied!!!
ルートディレクトリ見に行ってしまっているのかなと思い、./db.json
を試してみましたがダメでした。ググるって見ると、__dirname
を使えばいいよ!というポストを見つけたのですが、これもダメで・・・(ポストではelectronのバージョンがちょっと古かったのでそのせいかもしれません。)
ちなみに __dirname
は"/"
になっていて、やはりルートディレクトリをみているようでした。
メインプロセス(main.js)でのほぼお決まりの mainWindow.loadURL(
file://${__dirname}/app/index.html)
ではちゃんとなっているっぽいのに・・・
と書きながら思ったのですが、レンダラプロセスだからダメだった?今度調べよう。
でようやく対処法ですが
const remote = require('remote');
const app = remote.require('electron').app;
// pathを使っているのは半分好みなので必須ではありません。
const path = remote.require('path');
const low = require('lowdb')
const storage = require('lowdb/file-sync')
const dbFilename = path.join(app.getAppPath(), 'db.json');
const db = low(dbFilename, { storage });
要は自分の場所が分からないならappに教えてもらおうということです。