electron - 无法在 Electron 渲染器进程中使用sqlite : "Cannot read property ' _handle' of undefined"

标签 electron node-sqlite3

我正在尝试使用 node-sqlite3在 Electron 应用程序中,但在应用程序窗口中,我在 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)
    }
  })
}

只有在渲染器进程内(例如在 React 组件中)使用 const sqlite3 = require('sqlite3') 时才会发生这种情况。 require('sqlite3') 在主 Electron 进程中使用时没有任何问题(数据库调用有效)。

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,chrome 58.0.3029.110, Electron 1.7.10。

我在 github 上创建了一个问题 here .

最佳答案

它在渲染器进程中不起作用的原因是它是通过 browserify 捆绑的,它的目的是为浏览器生成 bundle 。您失败的特定代码依赖于node.js端全局变量(进程),因此browserify无法正确捆绑它。此外,sqlite3模块具有内部无法捆绑的 native 模块。其他 bundler (如 webpack)有方法(externals 选项)指定不尝试捆绑它,如果它支持,您可能需要使用 browserify 以类似的方式进行配置。

它还解释了示例应用程序为何有效,它不对渲染器进程进行任何捆绑。

关于electron - 无法在 Electron 渲染器进程中使用sqlite : "Cannot read property ' _handle' of undefined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48044239/

相关文章:

javascript - 如何在阅读 TTS 消息后添加页面刷新功能

javascript - 尝试在 Electron 应用程序中使用 Node fs 的不同方法创建新文件时出现错误

node.js - 在Node和sqlite3中插入多行多列

javascript - 如何避免在 Node 中插入重复记录,sqlite [knex,objectionJS]

node.js - 如何在 sequelize 中创建模型之间的关联

node.js - 来自 REST API 的 Windows Shell 命名空间扩展

javascript - 是否可以通过提供路径将文件从Electron应用发送到Express服务器?

node.js - 来自 Electron 渲染器进程的 require() Node 模块,通过 HTTP 提供服务

javascript - sqlite3更新查询刷新 Electron 渲染器进程

node.js - 在node-sqlite3中绑定(bind)blob参数