electron + sqlite3 解决打包后无法写入数据库

前言

window环境。

electron@28.0.0
sqlite3@5.1.6
使用 electron-builder 打包。

本文旨在解决打包后无法写入数据库的问题。

但如果你是打包后无法访问sqlite,且有报错弹窗,不妨也看看本文。
也许是同一种原因。

错误原因分析

打包后无法创建db文件,是因为大部分人连接db,
都是用path模块,采用
path.join(__dirname, 'data.db') 类似这样的写法。

因为网上的垃圾教程都是这么教的,笔者也深受其害。

默认情况下,打包后获得的目录格式为(假设你的输出目录是dist/

/dist/xxx.exe
/dist/resources/app.asar

xxx.exe是你的主程序。

electron打包后的项目根目录,指向app.asar 文件。

所以如果你在node里写的源代码是

const filePath = path.resolve(app.getAppPath(), 'storage', 'data.db')
const db = new sqlite3.Database(filePath)

在打包后,程序执行到这里,会去请求/dist/resources/app.asar/storage/data.sb文件。

再举一个例子,
假如你的项目目录是

myproject/package.json
myproject/main.js
myproject/src/dbserver/mydb.js
myproject/src/storage/data.db

然后在你mydb.js中这样写

const filePath = path.resolve(__dirname, '../storage/data.db')
const db = new sqlite3.Database(filePath)

在调试时候肯定是没问题的。

但是打包后,所有资源默认都被打包进app.asar,且根目录符号链接到app.asar
程序执行到这里就会请求/resources/app.asar/src/storage/data.db这个地址。

如果你的打包设置是正确的,这一步并不会报错,因为data.db的的确确被打包进了这个路径。
你可以正确读取。

但是 app.asar是一个只可读不可写的文件。
当你要写入数据库的时候,就会发现怎么都无法写,甚至程序不报错。
因为用promise封装的db写入请求,只会一直pending,而不会reject。

为什么 app.asar只可读不可写?
某种意义上你可以把它看成程序的一部分。
如果app.asar被改写了,你可以认为你的程序遭到了入侵。
一般而言electron甚至鼓励你去校验app.asar的完整性,来确保自己的分发版本是正确的。

看起来这是一个合理的设计。

所以我们要做的应该是,让我们的db请求路径,不要指向app.asar

正确解法

不要使用node提供的相对路径功能。
不要使用__dirname 变量。
不要使用electron.app.getAppPath()
这些东西最后都会指向app.asar

在生产环境就写一个相对路径字符串。

const isPackaged = app.isPackaged;
let filePath;
if(isPackaged){filePath = path.resolve('./resources/storage/data.db')
}
else{filePath = path.resolve(__dirname, '../storage/data.db')
}
const db = new sqlite3.Database(filePath)

同时在pakcge.json中配置extraResources字段。

"build":{"extraResources":  {"from": "./src/storage/","to": "storage"},
}

这样整个/myproject/src/storage 目录都会被复制到/dist/resources/storage/位置。

这样最后程序执行db时,会指向/dist/resources/storage/data.db位置。
因为在path.resolve('./resources/storage/data.db') 这条命令中的,. 指向当前xxx.exe的运行位置。

这同样暗示我们,data.db应该作为一个外部文件管理,不应该放在src里。
src应该视为程序本体,在打包后,运行时,永远不变。
data.db这种属于外部资源,打包后运行时会动态改变。
外部资源不应该在src里。
我上面举例的这种项目结构是不合理的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HarmonyOS开发】探究Hap与App包的结构与区别

1、Hap与App包的区别 OpenHarmony 可以进行两种形式(Hap和App)的打包,HAP是用于本地调试的,APP包是用于上架发布的。 根据不同的设备类型,一个APP包可以包含多个HAP包。 下面从两个角度进行分析 1.1 编译构建角度 编…

uniapp中uview的text组件

基本使用&#xff1a; 通过text参数设置文本内容。推荐您使用:textvalue的形式 <u--text text"我用十年青春,赴你最后之约"></u--text>设置主题&#xff1a; 通过type参数设置文本主题&#xff0c;我们提供了五类属性。primary error success warning…

javafx写一个文档编辑器

文本编辑器是一种用于编辑纯文本文件的工具。它具有基本的文本编辑功能,如插入、删除、复制、粘贴等。文本编辑器通常不具备格式化文本、排版和图形编辑等高级功能,专注于纯文本的编辑。常见的文本编辑器包括记事本(Notepad)、Sublime Text、Visual Studio Code、Atom、Emacs…

【leetcode100-021】【矩阵】搜索二维矩阵 II

【题干】 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 【思路】 以右上角为起点斜着看这个矩阵&#xff0c;会发现&#xff0c;这是一颗二叉搜索树。 …

中间件系列 - Redis入门到实战(高级篇-分布式缓存)

前言 学习视频&#xff1a; 黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 学习目标 Redis持久化Redis主从Redis哨兵Redis分片集群 一 分…

每日一题——LeetCode876.链表的中间结点

个人主页&#xff1a;白日依山璟 专栏&#xff1a;Java|数据结构与算法|每日一题 1.题目描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例1 输入&#xff1a;head [1,2,3,4,5] 输出&…

nginx-proxy-manager初次登录502 bad gateway

nginx-proxy-manager初次登录502 bad gateway 按照官方docker-compose安装后,页面如下: 默认账户密码: adminexample.com/changeme点击sign in,提示Bad Gateway 打开调试 重装后依然如此,最后查阅githup issue 找到答案 https://github.com/NginxProxyManager/nginx-proxy-…

【教学类-43-01】20231226 九宫格数独1.0

作品展示——九宫格数独&#xff08;正方形手工纸&#xff09; 背景需求&#xff1a; 最近陆续出了“X-Y比大小”“X-Y加法判断题”&#xff0c;发现1/3大4班孩子都能完成&#xff0c;3-4位孩子表示“太简单”。 大4班20号同学&#xff0c;做完0-10的判断题后说&#xff1a;“…

OpenHarmony开发者自测试框架初学指南

OH开发者自测试框架初学指南 前言前置环境搭建wsl2安装wsl2迁移源码下载编译环境 测试框架应用环境搭建libreadline-dev安装python库安装nfs-kernel-server验证 windows环境准备vscodeusbipd 生成测试用例更改BUILD.gn的配置项关于fuzz配置编写fuzz用例编译fuzz用例执行 后记 前…

redis在linux集群部署

1.下载redis wget http://download.redis.io/releases/redis-3.2.9.tar.gz 2.解压redis tar -zxvf redis-3.2.9.tar.gz 3.安装redis 在解压redis目录下 make install /usr/soft/redis/ 4.启动redis 在redis的bin目录 执行 ./redis.conf 5.设置redis 端口 密码 集群 vim redis.c…

mongodb聚合_删除_可视化工具

3.5 MongoDB中limit和skip MongoDB Limit() 方法 如果你需要在MongoDB中读取指定数量的数据记录&#xff0c;可以使用MongoDB的Limit方法&#xff0c;limit()方法接受一个数字参数&#xff0c;该参数指定从MongoDB中读取的记录条数。limit()方法基本语法如下所示&#xff1a;…

跟着LearnOpenGL学习12--光照贴图

文章目录 一、前言二、漫反射贴图三、镜面光贴图3.1、采样镜面光贴图 一、前言 在跟着LearnOpenGL学习11–材质中&#xff0c;我们讨论了让每个物体都拥有自己独特的材质从而对光照做出不同的反应的方法。这样子能够很容易在一个光照的场景中给每个物体一个独特的外观&#xf…

不浪费原料的汉堡制作方案(LeetCode日记)

LeetCode-1276-不浪费原料的汉堡制作方案 题目信息: 圣诞活动预热开始啦&#xff0c;汉堡店推出了全新的汉堡套餐。为了避免浪费原料&#xff0c;请你帮他们制定合适的制作计划。 给你两个整数 t o m a t o S l i c e s tomatoSlices tomatoSlices 和 c h e e s e S l i c…

【uniapp】Uniapp cli 自动化打包脚本实现

一、前言 通常使用uniapp开发app时&#xff0c;大多数会使用项目的云服务打包&#xff0c;否则的话再借助原生会变得极其复杂&#xff0c;还要去安装对应大内存的环境。如果恰好此时&#xff0c;你有一个需求是&#xff0c;可以随意的更换logo和封面、标题切换成另外一个app&a…

Hadoop集成对象存储和HDFS磁盘文件存储

1.环境配置 1.1 版本说明 组件版本是否必须其他事项Hadoop3.3.0是hadoop3.3.0之后原生支持国内主要对象存储Hive3.1.3否实测没有Hive也可以使用sparksql&#xff0c;使用hive更好的管理HDFS数据spark3.3.1是hive和spark整合后&#xff0c;语法为HSQL&#xff0c;自定义函数按…

深入理解 golang 中的反射机制

目录 什么是反射 反射的使用方法 反射的应用场景 反射的性能考量 反射的最佳实践 小结 反射机制是计算机科学中的一个重要概念&#xff0c;程序通过反射可以在运行时访问、检测和修改自身的状态和行为。Golang 作为静态类型的编译型语言&#xff0c;虽然在设计上倾向于简…

机器学习——决策树(三)

【说明】文章内容来自《机器学习——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 1、案例一 决策树用于是否赖床问题。 采用决策树进行分类&#xff0c;要经过数据采集、特征向量化、模型训练和决策树可视化4个步骤。 赖床数据链接&#xff1a;https://pan…

大语言模型激活函数绘图

使用torch中的激活函数&#xff0c;绘制多个激活函数多一个图中对比展示 引入依赖 import torch from torch.nn import functional as F import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [Arial Unicode MS]定义单个曲线图的绘制函数 def draw_single_plot…

解决Pycharm pip安装模块太慢问题,pycharm2022没有manage repositories配置镜像源

解决方案 方法清华阿里云中国科技大学华中理工大学 或者直接-i 加镜像 方法 URL写下面任意一个 清华 https://pypi.tuna.tsinghua.edu.cn/simple阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/华中理工大学 http:/…

钦丰科技(安徽)股份有限公司携卫生级阀门管件盛装亮相2024发酵展

钦丰科技(安徽)股份有限公司携卫生级阀门管件盛装亮相2024济南生物发酵展&#xff01; 展位号&#xff1a;2号馆A65展位 2024第12届国际生物发酵产品与技术装备展览会&#xff08;济南&#xff09;于3月5-7日在山东国际会展中心盛大召开&#xff0c;展会同期将举办30余场高质…