2017-12-31 41 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에서 발생

(이 파일을 자동으로 생성 및 삭제, 내가 그것을 기록하지 않았다는) 다음 내부 const sqlite3 = require('sqlite3')를 사용하는 경우

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 구성 요소). 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를 사용하여 비슷한 방식으로 구성해야 할 수도 있습니다.

또한 예제 응용 프로그램이 작동하는 이유, 렌더러 프로세스에 대해 번들링을 수행하지 않는 이유에 대해서도 설명합니다.

+0

전자 제품에는 웹팩이 필요하지 않습니다. 바벨 만 있으면 충분합니다. – vmarquet

+0

main/renderer proc의 시작 성능을 조이고 싶다면 webpack이 필요합니다. 네이티브 node.js'require'는 비용이 많이 들고 응용 프로그램이 시작될 때 많은 비용이 듭니다. –

관련 문제