Сбои электрона, когда требуется собственный модуль sqlite3 в разветвленном процессе - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь использовать модуль sqlite3 в дочернем процессе с электроном, но получаю ошибку неопределенного символа.Кроме того, ошибка возникает только тогда, когда я запускаю программу из node.js электрона, но когда я запускаю программу из обычного node.js, все работает нормально.Я думаю, что проблема может быть связана с «нативностью» модуля sqlite3, и я попытался electron-rebuild, npm --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

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Я исправил ту же проблему:

  1. Обновление Electron до v6 Beta.Версия 6 имеет необходимую функцию добавление process.versions.electron для получения версии Electron в разветвленных процессах .
  2. Использование Electron-Builder Команда "install-app-deps" в качестве сценария после установки.Это значит поместить "postinstall": "electron-builder install-app-deps" в мои скрипты npm в package.json.

Что касается , почему возникает проблема:

  • Основной модуль node-sqlite3 использует node-pre-gyp, чтобы выяснить, какой скомпилированный двоичный файл sqlite дляrequire
  • node-pre-gyp пытается определить время выполнения процесса, чтобы вернуть путь к правильному двоичному файлу для процесса / платформы.
  • Функция обнаружения node-pre-gyp (get_process_runtime в versioning.js) просматривает process.versions.electron, чтобы увидеть, является ли процесс электронным процессом.В противном случае он предполагает Node-процесс.
  • Поскольку process.versions.electron не было реализовано в моей версии Electron (v5) для разветвленных процессов, узел-pre-gyp принял процесс Node и возвратил путь к node-v70-win32-x64, который не существовал, потому что узелверсия, которую я использую для npm install node-sqlite3, отличается от версии узла, о которой разветвленный процесс сообщает узлу pre-gyp.У меня есть node-v67-win32-x64 в моем каталоге node_modules/sqlite3/lib/binding.
  • Таким образом, хотя электронный строитель правильно создал electron-v5.0-win32-x64 в node_modules/sqlite3/lib/binding, node-pre-gyp вернул node-v70-win32-x64 в node-sqlite3 и, конечно, модуль не был найден.Таким образом, заключительной частью было обновление до Electron v6, который сообщает версию Electron разветвленным процессам, что позволяет предварительному анализу узла обнаруживать электронный процесс и возвращать верный путь к двоичному файлу, созданному создателем электронов, в данном случае node_modules/sqlite3/lib/binding/electron-v6.0-win32-x64,
0 голосов
/ 20 октября 2018

Я нашел корень проблемы.Вот соответствующие проблемы и запросы на удаление 1 , запросы на получение 2 на GitHub.

Мои шаги по временному устранению проблемы были следующими:

  • Клон git-репозитория pre-gyp
  • checkout до версии, которую хочет sqlite3 (на данный момент 0.10.3)
  • Применить патч из второго пуллаrequest
  • Установите этот исправленный узел-pre-gyp через npm install ../path/to/patched/node-pre-gyp из основной папки проекта
  • npm i --build-from-source sqlite3 (не уверен, что эта команда необходима) и ./node_modules/.bin/electron-rebuild из основной папки проекта(Я установил электронное восстановление)
  • вызов fork с установленной электронной версией, например:

    fork('fork', [], { env: { ELECTRON_VERSION: "3.0.5" }});

Этоэто взломать, но, похоже, работает.Надеюсь, что проблема будет исправлена ​​в апстриме.

отредактировано: исправлена ​​ссылка на запрос на извлечение (я использовал второй, а не первый) запрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...