背景
在我的应用程序中,我有一个名为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
成功加载数据库文件,但是,通过在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)
但是,在执行此操作后,我既不能加载运行.exe
的数据库文件,也不能通过运行npm start
来加载。
问题:
我想知道存储我的数据库文件的正确方法是什么,以及如何在我的后端程序中编写它的路径(本例中为main.js
)。感谢。
答案 0 :(得分:3)
运行.exe
时,当前目录可能不同,因此相对路径不正确。如您所知,您需要整理完整路径,而不是process.resourcesPath
,您应该使用app.getAppPath()
。
let dbFile = path.join(app.getAppPath(), 'app', 'db', 'example.db')
这应该给出数据库文件的正确路径。您可能遇到的另一个问题是.exe
通常会以Asar格式打包,这样可以提供读取权限但不能进行写入权限。因此,如果您需要写入数据库,最好将其放在其他位置。 electron.app.getPath(name) API提供了许多路径,因此您可以使用app.getPath("userData")
获取为每个用户的应用程序数据提供的路径。在这种情况下,您的应用程序必须在该位置创建数据库文件。
答案 1 :(得分:0)
我做了几次尝试,唯一对我有用的是用数据库文件替换 app.asar 文件,即
const { app } = window.require('electron').remote;
const appPath = app.getAppPath().replace("app.asar", "db_name.sqlite");