无法在电子渲染器进程中使用 sqlite:"Cannot read property '_handle' of undefined"
Can't use sqlite in electron renderer process: "Cannot read property '_handle' of undefined"
我正在尝试在 Electron 应用程序中使用 node-sqlite3,但在应用程序 window 中,我在 chrome 控制台中收到以下错误:
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说明可以在renderer进程中使用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",
...
}
}
我使用:node 7.9.0,chrome 58.0.3029.110,electron 1.7.10.
我在 github here 上创建了一个问题。
它在您的渲染器进程中不起作用的原因是它是通过 browserify 捆绑的,旨在为 browser
生成捆绑包。您失败的特定代码依赖于 node.js 端全局变量(进程),因此 browserify 无法正确捆绑它。此外,sqlite3 模块内部有本机模块,无法捆绑。像 webpack 这样的其他打包器有办法(externals
选项)指定不尝试打包它,如果它支持的话,你可能需要使用 browserify 以类似的方式配置。
它还解释了为什么示例应用程序可以工作,它不为渲染器进程做任何捆绑。
我正在尝试在 Electron 应用程序中使用 node-sqlite3,但在应用程序 window 中,我在 chrome 控制台中收到以下错误:
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说明可以在renderer进程中使用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",
...
}
}
我使用:node 7.9.0,chrome 58.0.3029.110,electron 1.7.10.
我在 github here 上创建了一个问题。
它在您的渲染器进程中不起作用的原因是它是通过 browserify 捆绑的,旨在为 browser
生成捆绑包。您失败的特定代码依赖于 node.js 端全局变量(进程),因此 browserify 无法正确捆绑它。此外,sqlite3 模块内部有本机模块,无法捆绑。像 webpack 这样的其他打包器有办法(externals
选项)指定不尝试打包它,如果它支持的话,你可能需要使用 browserify 以类似的方式配置。
它还解释了为什么示例应用程序可以工作,它不为渲染器进程做任何捆绑。