首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在电子呈现器进程中使用sqlite:“无法读取未定义的属性'_handle‘”

无法在电子呈现器进程中使用sqlite:“无法读取未定义的属性'_handle‘”
EN

Stack Overflow用户
提问于 2018-01-01 00:47:58
回答 1查看 2K关注 0票数 2

我正尝试在一个电子应用程序中使用node-sqlite3,但在应用程序窗口中,我在chrome控制台中得到以下错误:

代码语言:javascript
复制
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行(这个文件是自动生成并删除的,不是我写的):

代码语言:javascript
复制
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

代码语言:javascript
复制
{
  ...,
  "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,电子1.7.10。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-01 21:45:14

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

它还解释了示例应用程序工作的原因,它不会为渲染器进程做任何捆绑。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48044239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档