Node.js 在分叉进程中需要sqlite3本机模块时,Electron崩溃
我试图在带有electron的子进程中使用sqlite3模块,但我得到了未定义符号的错误。此外,只有当我从electron的node.js运行程序时,错误才会发生,但当我从普通的node.js运行程序时,一切正常。我认为问题可能与sqlite3模块的“本地性”有关,我尝试了Node.js 在分叉进程中需要sqlite3本机模块时,Electron崩溃,node.js,electron,Node.js,Electron,我试图在带有electron的子进程中使用sqlite3模块,但我得到了未定义符号的错误。此外,只有当我从electron的node.js运行程序时,错误才会发生,但当我从普通的node.js运行程序时,一切正常。我认为问题可能与sqlite3模块的“本地性”有关,我尝试了electron-rebuild,npm-从源代码构建,但没有帮助 main.js: const { fork } = require('child_process'); fork('fork'); fork.js: con
electron-rebuild
,npm-从源代码构建,但没有帮助
main.js:
const { fork } = require('child_process');
fork('fork');
fork.js:
const sqlite3 = require('sqlite3');
package.json:
{
"name": "bugreproduce_sqlite",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"sqlite3": "^4.0.2"
},
"devDependencies": {
"electron": "^3.0.5"
}
}
输出:
> ./node_modules/electron/dist/electron .
/home/myuser/Programming/javascript/bugreproduce_sqlite/node_modules/electron/dist/electron: symbol lookup error: /home/myuser/Programming/javascript/bugreproduce_sqlite/node_modules/sqlite3/lib/binding/node-v64-linux-x64/node_sqlite3.node: undefined symbol: _ZN2v816FunctionTemplate3NewEPNS_7IsolateEPFvRKNS_20FunctionCallbackInfoINS_5ValueEEEENS_5LocalIS4_EENSA_INS_9SignatureEEEiNS_19ConstructorBehaviorENS_14SideEffectTypeE
我找到了根本问题。
以下是GitHub上的相关和
我暂时解决问题的步骤是:
- 克隆gyp git存储库之前的节点
签出到sqlite3想要的版本(目前为0.10.3)
- 从第二次拉取请求中应用修补程序
- 通过主项目文件夹中的npm Install../path/to/patched/node pre-gyp
安装此修补节点pre-gyp
npm i——从源sqlite3构建(不确定是否需要此命令)和从主项目文件夹(我安装了electron rebuild)构建/node\u modules/.bin/electron rebuild
)
fork
,如下所示:
fork('fork',[]{
环境:{
电子版:“3.0.5”
}});代码>
编辑:修复拉动请求链接(我使用了第二个拉动请求,而不是第一个)我通过以下方式修复了相同的问题:
“postinstall”:“electron builder安装应用程序deps”
李>
至于为什么会发生这个问题:
- node-sqlite3的主模块使用node-pre-gyp来确定需要哪个已编译的sqlite二进制文件
- 节点pre-gyp尝试检测流程运行时,以返回流程/平台的正确二进制文件的路径李>
- node pre gyp的检测函数(
,在versioning.js中)查看get_process\u runtime
,查看该进程是否为electron进程。否则,它将假定一个节点进程李>process.versions.electron
- 由于
未在我的electron(v5)版本中为分叉进程实现,node pre gyp采用了一个节点进程,并返回了一个指向process.versions.electron
的路径,该路径不存在,因为我用于node-v70-win32-x64
的节点版本与分叉进程报告给node pre gyp的节点版本不同。我的npm安装node-sqlite3
目录中确实有node_modules/sqlite3/lib/binding
李>node-v67-win32-x64
- 因此,尽管electron builder在
中正确创建了node_modules/sqlite3/lib/binding
,但node-pre-gyp将electron-v5.0-win32-x64
返回给node-sqlite3,当然找不到该模块。因此,最后一部分是更新到Electron v6,它向分叉进程报告Electron版本,允许node pre gyp检测Electron进程并返回Electron builder创建的二进制文件的正确路径,在本例中为node-v70-win32-x64
李>node_modules/sqlite3/lib/binding/Electron-v6.0-win32-x64
devDependency:electron builder
npm i
文件属性中,例如文件:[“!*.log”、“!doc”、…、“child.js”]
。像这样,子项被添加到应用程序根目录下的asar存档中。不要使用electron builder的外部文件
/外部资源
,并尝试这样分叉子项,您的子项将找不到sqlite3
二、 在应用程序的“main.ts”文件中,按以下方式启动子项:
fork(path.resolve(app.getAppPath(), 'child.js')
这应该可以,希望对任何人都有帮助
fork(path.resolve(app.getAppPath(), 'child.js')