Electron-packager:打包后无法定位本地db文件

Yua*_* Ma 5 sqlite electron electron-packager

背景: 在我的应用程序,我有一个本地数据库文件,命名example.db它是由读main.js。项目结构和我的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)
Run Code Online (Sandbox Code Playgroud)

包.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"
  }
}
Run Code Online (Sandbox Code Playgroud)

问题:

我可以通过运行 成功加载 DB 文件npm start,但是,在我通过在Example文件夹下运行以下命令行将我的程序成功打包到 Windows 平台后:

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

我运行了该.exe文件,但系统显示找不到我的数据库文件。

在此处输入图片说明

尝试过的方法:

我尝试main.js使用process.resourscesPath以下方法修改 db 文件路径:

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

但是,这样做之后,我既不能从 running 加载 DB 文件.exe,也不能通过运行npm start.

题:

我想知道存储我的数据库文件的正确方法是什么,以及如何在我的后端程序中写入它的路径(main.js在本例中)。谢谢。

Jus*_*ery 8

运行时.exe,当前目录可能不同,因此相对路径将不正确。正如您发现的那样,您需要将完整路径放在一起,但process.resourcesPath您不应该使用app.getAppPath().

let dbFile = path.join(app.getAppPath(), 'app', 'db', 'example.db')
Run Code Online (Sandbox Code Playgroud)

这应该是数据库文件的正确路径。您可能面临的另一个问题是,.exe通常会使用Asar格式打包,它提供读访问权限但不提供写访问权限。因此,如果您需要写入数据库,最好将其放在其他地方。Electron.app.getPath(name) API提供了许多路径,例如,您可以app.getPath("userData")用来获取为每个用户的应用程序数据提供的路径。在这种情况下,您的应用程序必须在该位置创建数据库文件。