Electron-packager:打包后找不到本地数据库文件

Electron-packager: can not locate local db file after packing

背景: 在我的应用程序中,我有一个名为 example.db 的本地数据库文件,由 main.js 读取。项目结构和我的 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)

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"
  }
}

问题:

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

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

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

尝试过的方法:

我尝试使用 process.resourscesPath 修改 main.js 中的数据库文件路径,如下所示:

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

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

问题:

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

当运行与.exe时,当前目录可能不同,所以相对路径不正确。当你发现你需要把一个完整的路径放在一起时,而不是 process.resourcesPath 你应该使用 app.getAppPath().

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

这应该是数据库文件的正确路径。您可能面临的另一个问题是 .exe 通常会与 Asar format, which gives read access but not write access. So if you need to write to the database, it may be better to place it elsewhere. There are a number of paths provided by the electron.app.getPath(name) API 一起打包,因此例如您可以使用 app.getPath("userData") 来获取为每个提供的路径用户应用程序数据。在这种情况下,您的应用程序必须在该位置创建数据库文件。

我做了几次尝试,唯一对我有用的是用数据库文件替换 app.asar 文件,即

const { app } = window.require('electron').remote;
const appPath = app.getAppPath().replace("app.asar", "db_name.sqlite");