我正在尝试在带有 Electron 的子进程中使用sqlite3模块,但出现 undefined symbol 的错误。而且,仅当我从 Electron 的node.js运行程序时才会发生错误,但是当我从通常的node.js运行程序时,一切正常。我认为问题可能与sqlite3模块的“本地性”有关,我尝试了electron-rebuildnpm --build-from-source,但它们没有帮助。

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上的相关issuepull request 1pull request 2

我临时解决此问题的步骤是:

  • 克隆 Node 之前的gyp git存储库
  • checkout到sqlite3想要的版本(目前为0.10.3)
  • 从第二个拉取请求
  • 应用补丁
  • 从主项目文件夹
  • 中通过npm install ../path/to/patched/node-pre-gyp安装此补丁前的gyp
  • npm i --build-from-source sqlite3(不确定是否需要此命令)和主项目文件夹中的./node_modules/.bin/electron-rebuild(我安装了electronic-rebuild)
  • 调用fork并设置了 Electron 版本,如下所示:
    fork('fork', [], { env: { ELECTRON_VERSION: "3.0.5" }});

  • 这是一个hack,但它似乎可以正常工作。希望问题将在上游得到解决。

    编辑:固定的拉取请求链接(我使用了第二个拉取请求,而不是第一个)

    关于node.js - 在 fork 过程中需要sqlite3 native 模块时, Electron 崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52897950/

    10-16 20:01