1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Electronのレンダラーでうっかりメイン側node.jsのrequestを使っちゃったら

Posted at

結論

本質
わざわざメインプロセスからラッパーを呼び出さず、XMLHttpRequest書きましょう。

一言で
レンダラー側が終了するときは、requestを中止しなければならない。

事前知識
レンダラーウィンドウが切り替わる(終了・更新・遷移)ときは、メインプロセスとのイベントをクリアしなければならない

以下動作からの憶測
node.jsrequestも、メインプロセスから呼び出している以上、メインプロセスと関係がある。
なので、リクエストが完了し、レンダラープロセスで完了時の処理を行うとき、既に開放されていれば、メインプロセス側から参照先がなくなりエラーとなる。

環境

  • Electron 0.37.2
  • Windows 7

事象

定期的に外部にgetを行うページから別ページに移動したとき、不定期に
eerror.JPG
のエラーがでる。
対象コードは

var request = require("remote").require('request')
request.get({url: url + tag, json:true} ,function (error, response, body) {

解決

レンダラー側が終了したのにリクエストが残り、完了してしまうのが原因なので、呼び出したjsが終了するときに、通信も中断する。
発生が不定期なのでまだ確証が得られていないが、未だエラーには遭遇していない。

javascript - node.js: how to stop an already started http request - Stack Overflow

// 移動時にリクエストを中止するためのrequestの返り値
var watchRequest
var request = require("remote").require('request')
watchRequest = request.get({url: url + tag, json:true} ,function (error, response, body) {
// 中略

// リロードではcloseが呼ばれないのでだいたいこちらに書いている
window.addEventListener('beforeunload', function() {
	// 通信を中断してメインプロセスがこちらを呼びだそうとさせない
	watchRequest.abort()
})

:question: なぜXMLHttpRequest使わなかった?

多分、理解することと書くこととが面倒で、request.get()のほうが簡単だったから…
横着の報いが無駄なイベント登録となりました。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?