Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在分叉进程中需要sqlite3本机模块时,Electron崩溃_Node.js_Electron - Fatal编程技术网

Node.js 在分叉进程中需要sqlite3本机模块时,Electron崩溃

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的子进程中使用sqlite3模块,但我得到了未定义符号的错误。此外,只有当我从electron的node.js运行程序时,错误才会发生,但当我从普通的node.js运行程序时,一切正常。我认为问题可能与sqlite3模块的“本地性”有关,我尝试了
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”
    }});

  • 这是一个黑客,但它似乎工作。希望问题能在上游得到解决


    编辑:修复拉动请求链接(我使用了第二个拉动请求,而不是第一个)

    我通过以下方式修复了相同的问题:

  • 将Electron更新为v6 Beta版。版本6具有所需的功能
  • 将的“install app deps”命令用作安装后脚本。这意味着在package.json中的我的npm脚本中放入
    “postinstall”:“electron builder安装应用程序deps”
    至于为什么会发生这个问题:

    • node-sqlite3的主模块使用node-pre-gyp来确定需要哪个已编译的sqlite二进制文件
    • 节点pre-gyp尝试检测流程运行时,以返回流程/平台的正确二进制文件的路径
    • node pre gyp的检测函数(
      get_process\u runtime
      ,在versioning.js中)查看
      process.versions.electron
      ,查看该进程是否为electron进程。否则,它将假定一个节点进程
    • 由于
      process.versions.electron
      未在我的electron(v5)版本中为分叉进程实现,node pre gyp采用了一个节点进程,并返回了一个指向
      node-v70-win32-x64
      的路径,该路径不存在,因为我用于
      npm安装node-sqlite3
      的节点版本与分叉进程报告给node pre gyp的节点版本不同。我的
      node_modules/sqlite3/lib/binding
      目录中确实有
      node-v67-win32-x64
    • 因此,尽管electron builder在
      node_modules/sqlite3/lib/binding
      中正确创建了
      electron-v5.0-win32-x64
      ,但node-pre-gyp将
      node-v70-win32-x64
      返回给node-sqlite3,当然找不到该模块。因此,最后一部分是更新到Electron v6,它向分叉进程报告Electron版本,允许node pre gyp检测Electron进程并返回Electron builder创建的二进制文件的正确路径,在本例中为
      node_modules/sqlite3/lib/binding/Electron-v6.0-win32-x64

    因为这些问题可能非常耗时,所以我只需花两分钱:我也在从一个电子应用程序派生一个依赖sqlite3的过程

    我的设置和工作方式如下(Electron v8.0.1):

    有两个项目文件夹,“父”和“子”。父项目是包含主代码和渲染器代码的electron项目

    在父项中:

  • 包含为
    devDependency:electron builder
  • 作为安装后脚本添加electron builder安装应用程序deps
  • 如果这是在添加electron builder后立即执行的,请手动运行postinstall。将来,它会在
    npm i
  • 这应该注意保护sqlite3不受电子干扰

    现在让子进程使用该库

  • 子进程开发也依赖于sqlite,所以只需在本地安装它
  • 我使用webpack捆绑所有js文件
  • 要让webpack为后端工作,我添加
  • (通过这种方式,webpack不会尝试绑定到sqlite3中,因为sqlite3不适用于本机模块

    回到父级:

    I.假设输出包名为“child.js”,将其复制到父文件夹,并将其添加到“electron builder.json”文件中的
    文件
    属性中,例如
    文件:[“!*.log”、“!doc”、…、“child.js”]
    。像这样,子项被添加到应用程序根目录下的asar存档中。不要使用electron builder的
    外部文件
    /
    外部资源
    ,并尝试这样分叉子项,您的子项将找不到sqlite3

    二、 在应用程序的“main.ts”文件中,按以下方式启动子项:

    fork(path.resolve(app.getAppPath(), 'child.js')
    
    这应该可以,希望对任何人都有帮助

    fork(path.resolve(app.getAppPath(), 'child.js')