2017-03-20 6 views
1

背景梱包後ローカルDBファイルを見つけることができません。私のアプリでは を、私はmain.jsによって読み取られexample.dbという名前のローカルDBファイルを、持っています。プロジェクトの構成と私のmain.jsプログラムの一部を以下に示します。電子・パッケージャは:

Projectフォルダアーキテクチャ

enter image description here

main.js

const { 
    app, 
    BrowserWindow, 
    dialog, 
    Menu 
} = require('electron') 

const fs = require('fs') 
const path = require('path') 

const sqlite3 = require('sqlite3').verbose() 

// load dataBase 
let dbFile = 'app/db/example.db' 
const db = new sqlite3.Database(dbFile) 

Package.json

{ 
    "name": "Example", 
    "version": "1.0.0", 
    "description": "", 
    "main": "./app/main.js", 
    "scripts": { 
    "postinstall": "install-app-deps", 
    "start": "electron ." 
    }, 
    "keywords": [], 
    "author": "", 
    "license": "ISC", 
    "devDependencies": { 
    "electron-builder": "^15.5.1", 
    "electron-prebuilt": "^1.4", 
    "electron-rebuild": "^1.5.7", 
    "electron-packager": "^8.1.0" 
    }, 
    "dependencies": { 
    "jquery": "^3.1.1", 
    "sqlite3": "^3.1.8" 
    } 
} 

問題:

私は成功しExampleフォルダの下に次のコマンドラインを実行して、Windowsプラットフォームに私のプログラムを梱包後、しかし、npm startを実行して成功したDBファイルを読み込むことができます。

node_modules/.bin/electron-packager --platform=win32 --arch=x64 .

.exeファイルを実行しましたが、データベースファイルが見つからないことがシステムによって示されました。私はどちらも、

// load dataBase 
let dbFile = path.join(process.resourcesPath, '/app/db/example.db') 
const db = new sqlite3.Database(dbFile) 

しかし、それをやった後:私は、次のようprocess.resourscesPathを使用してmain.js内のdbファイルパスを変更しようとした

:メソッドを試した

enter image description here

.exeからDBファイルをロードすることはできません。また、npm startを実行してDBファイルをロードすることはできません。

質問:

私は正しい私のデータベースファイルを格納するための方法、およびどのように私のバックエンドプログラム(この例ではmain.js)でのパスを書くことであるものにしたいです。ありがとう。

+0

私はindex.htmlをどのように電子に読み込むかと同じようなパスを使わなければならないと思います。 '__dirname'で試してください –

答えて

0

.exeを実行すると、現在のディレクトリが異なるため、相対パスが正しくない可能性があります。あなたが理解したように、完全なパスをまとめる必要がありますが、process.resourcesPathではなく、app.getAppPath()を使用してください。

let dbFile = path.join(app.getAppPath(), 'app', 'db', 'example.db') 

これは、データベースファイルへの正しいパスを与える必要があります。あなたが直面する可能性のあるもう1つの問題は、が通常、Asar形式でパッケージ化されているため、読み取りアクセスは可能ですが書き込みアクセスはできません。したがって、データベースに書き込む必要がある場合は、別の場所に配置する方がよいでしょう。 electron.app.getPath(name) APIによって提供されるいくつかのパスがあります。たとえば、ユーザーごとのアプリケーションデータに提供されるパスを取得するには、app.getPath("userData")を使用できます。この場合、アプリケーションはその場所にデータベースファイルを作成する必要があります。

+0

私のdbFileに 'app.getAppPath()'を追加してあなたのメソッドを試しました。この方法はmacOSでは動作しますが、Windowsでは動作しません。私は理由を知らない... –

+0

おそらく、Windowsは異なるパス区切り文字を使用するためです。 path.joinにパス区切り文字を入力させるように編集しました。 –

+0

どういうわけか、突然動きます...とにかく、ありがとうございました!それは私に多くの時間を節約します! –

関連する問題