2017-12-31 133 views
1

電子アプリケーションでnode-sqlite3を使用しようとしていますが、アプリケーションウィンドウで次のエラーが発生します。クロームコンソール:電子レンダラープロセスでsqliteを使用できません: "未定義の '_handle'プロパティを読み取ることができません"

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) 

エラーが(このファイルが自動的に生成され、削除されて、私はそれを書いていない)file:///[...]/assets/js/node_modules/sqlite3/node_modules/set-blocking/index.jsの3行目で起こる:

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) 
    } 
    }) 
} 

内部const sqlite3 = require('sqlite3')を使用している場合にのみ、この現象が発生しますレンダラープロセス(Reactコンポーネントなど) require('sqlite3')は、メイン電子プロセスで使用されても問題なく動作します(データベース呼び出し動作)。

This example appは、レンダラープロセスでsqliteモジュールを使用できることを示しています。私はそれが私の場合にはうまくいかない理由を理解していない。マイ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", 
    ... 
    } 
} 

私が使用:ノード7.9.0、クロム58.0.3029.110、電子1.7.10。

github hereに関する問題を作成しました。

+0

関連:https://stackoverflow.com/questions/43898072/ – vmarquet

+0

関連:https://stackoverflow.com/questions/38997260/ – vmarquet

+0

レンダリング側のコードをbrowserifyでバンドルしているようですが、それは間違いありませんか? –

答えて

2

あなたのレンダラプロセスでうまくいかない理由は、browserのバンドルを生成することを目的としたbrowserifyでバンドルされているからです。失敗している特定のコードはnode.js側のグローバル(プロセス)に依存しているため、browserifyは正しくバンドルできません。また、sqlite3モジュールにはバンドルできないネイティブモジュールがあります。 webpackのような他のバンドルでは、バンドルしようとしないように指定する方法(externalsオプション)があります。サポートしている場合は、browserifyを使用して同様の方法で設定する必要があります。

また、なぜexampleアプリケーションが動作するのか、レンダラープロセスのバンドル処理を行わない理由についても説明します。

+0

ウェブには電子部品は必要ありませんが、バベルだけで十分です。 – vmarquet

+0

main/renderer procの起動パフォーマンスを絞りたい場合は、まだwebpackが必要です。 native node.js 'require'は非常に高価で、アプリケーションが起動すると多くの費用がかかります。 –

関連する問題