2017-12-31 113 views
1

Ich versuche, node-sqlite3 in einer Elektronen-App zu verwenden, aber im App-Fenster erhalte ich den folgenden Fehler in der Chromkonsole:sqlite kann nicht im Elektronenrendererprozess verwendet werden: "Eigenschaft '_handle' von undefined kann nicht gelesen werden

Uncaught TypeError: Cannot read property '_handle' of undefined 
    at file:///[...]/assets/js/bundle.js:38727:15 
    at Array.forEach (native) 
    at module.exports (file:///[...]/assets/js/bundle.js:38726:36) 
    at Object.<anonymous> (file:///[...]/assets/js/bundle.js:34699:1) 
    at Object.147._process (file:///[...]/assets/js/bundle.js:34999:4) 
    at s (file:///[...]/assets/js/bundle.js:1:254) 
    at file:///[...]/assets/js/bundle.js:1:305 
    at Object.<anonymous> (file:///[...]/assets/js/bundle.js:32065:11) 
    at Object.141.../package.json (file:///[...]/assets/js/bundle.js:32246:4) 
    at s (file:///[...]/assets/js/bundle.js:1:254) 

der Fehler in Zeile 3 von file:///[...]/assets/js/node_modules/sqlite3/node_modules/set-blocking/index.js geschieht (diese Datei wird automatisch generiert und gelöscht, ich habe es nicht geschrieben):

module.exports = function (blocking) { 
    [process.stdout, process.stderr].forEach(function (stream) { 
    if (stream._handle && stream.isTTY && typeof stream._handle.setBlocking === 'function') { 
     stream._handle.setBlocking(blocking) 
    } 
    }) 
} 

Dies geschieht nur, wenn const sqlite3 = require('sqlite3') innerhalb der Verwendung Renderer-Prozess (zB in einer React-Komponente). require('sqlite3') funktioniert ohne Probleme (Datenbankanruf funktioniert), wenn es im Hauptelektronenprozess verwendet wird.

This example app zeigt, dass es möglich ist, das sqlite-Modul im Renderer-Prozess zu verwenden. Ich verstehe nicht, warum es in meinem Fall nicht funktioniert.

Mein package.json:

{ 
    ..., 
    "scripts": { 
    "postinstall": "install-app-deps", 
    "start": "electron .", 
    "watch": "watchify app/app.js -t babelify -o assets/js/bundle.js --debug --verbose", 
    "watch-style": "sass -r sass-globbing --watch style/application.scss:assets/css/bundle.css" 
    }, 
    "devDependencies": { 
    "babel-preset-stage-2": "^6.24.1", 
    "electron-builder": "^19.49.4" 
    }, 
    "dependencies": { 
    "babel": "^6.23.0", 
    "babel-core": "^6.26.0", 
    "babel-preset-es2015": "^6.24.1", 
    "babel-preset-react": "^6.24.1", 
    "babelify": "^8.0.0", 
    "browserify": "^14.5.0", 
    "electron": "^1.7.10", 
    "electron-reload": "^1.2.2", 
    "electron-window-state": "^4.1.1", 
    "react": "^16.2.0", 
    "sqlite3": "^3.1.13", 
    "watchify": "^3.9.0", 
    ... 
    } 
} 

Ich benutze: Knoten 7.9.0, Chrom 58.0.3029.110, Elektron 1.7.10.

Ich habe ein Problem auf GitHub here erstellt.

+0

Verwandte: https://StackOverflow.com/Questions/43898072/ – vmarquet

+0

Ähnliche: https://StackOverflow.com/Questions/38997260/ – vmarquet

+0

sieht aus wie Sie Renderer Seitencode über browserify bündeln, ist das korrekt? –

Antwort

2

Der Grund, warum es in Ihrem Renderer-Prozess nicht funktioniert, ist, dass es über browserify gebündelt ist, das darauf abzielt, ein Bundle für browser zu generieren. Spezifischer Code, der fehlschlägt, basiert auf den Globals (Prozess) von node.js side, so dass browserify nicht in der Lage ist, ihn korrekt zu bündeln. Darüber hinaus haben sqlite3 Module native Module, die nicht gebündelt werden können. Andere Bundler wie webpack haben die Möglichkeit (externals Option) anzugeben, es nicht zu versuchen, es zu bündeln, Sie müssen möglicherweise auf ähnliche Weise mit Hilfe von browserif konfigurieren, wenn es dies unterstützt.

Es erklärt auch, warum Beispiel App funktioniert, es keine Bündelung für Renderer-Prozess.

+0

Webpack wird nicht für Elektron benötigt, nur Babel ist genug. – vmarquet

+0

Sie _may_ brauchen Webpack immer noch, wenn Sie Start-Performance für Main/Renderer Proc beiden drücken möchten. native node.js 'require' ist sehr teuer und kostet viel, wenn die Anwendung gestartet wird. –

Verwandte Themen