User-Agent
をつけたりJSON.stringify(params)
してみたが同様のエラーに阻まれた。
ブツ
インストール&実行
NAME='Electron.net.request.CONNECTION.REFUSED.20220827113011'
git clone https://github.com/ytyaru/$NAME
cd $NAME
npm install
npm start
準備
- GitHubアカウントを作成する
repo
スコープ権限をもったアクセストークンを作成する- インストール&実行してアプリ終了する
db/setting.json
ファイルが自動作成される
db/setting.json
に以下をセットしファイル保存するusername
に任意のGitHubユーザ名token
にrepo
スコープ権限を持ったトークンrepo
に任意リポジトリ名(mytestrepo
等)
dst/mytestrepo/.git
が存在しないことを確認する(あればdst
ごと削除する)- GitHub上に同名リモートリポジトリが存在しないことを確認する(あれば削除する)
実行
npm start
で起動またはアプリでCtrl+Shift+Rキーを押す(リロードする)git init
コマンドが実行されるrepo/リポジトリ名
ディレクトリが作成され、その配下に.git
ディレクトリが作成される
- createRepo実行後、以下エラーが出る(リモートリポジトリも作成されず)
A JavaScript error occurred in the main process
Uncaught Exception:
Error: net:ERR_CONNECTION_REFUSED
at SimpleURLLoaderWrapper.<anonymous> (node:electron/js2c/browser_init:101:7169)
at SimpleURLLoaderWrapper.emit (node:events:527:28)
経緯
上記のときにnet:ERR_CONNECTION_REFUSED
ダイアログエラーが出た。
その後、以下のとき、createRepoするときはUser agent の必要性があると判明した。それがないときhttps.requestでは403エラーになっていた。
よく見返してみると、net.requestのときはUser-Agent
を付与していなかった。なら、net.requestでもUser-Agent
をつければイケるのでは? と思い至る。
そこで今回、改めてUser-Agent
をセットした上でnet.requestを試してみた。結果は同じnet:ERR_CONNECTION_REFUSED
エラーだった……。
結局やはり原因不明。
src/js/app/github/github.js
コード抜粋。
await window.myApi.request({
'method': 'POST',
url: 'https://api.github.com/user/repos',
headers: {
'Authorization': `token ${this.token}`,
'User-Agent': `${this.username}`,
'Content-Type': 'application/json',
},
"body": JSON.stringify(params),
},(json, res)=>{
console.debug(res)
console.debug(json)
},(res)=>{
console.debug(res)
})
Electronのnet.requestで謎エラー(net:ERR_CONNECTION_REFUSED)のときと比べてUser-Agent
とContent-Type
を追加した。でも結果は変わらなかった。Content-Type
をコメントアウトしても同じ。
さらに、念の為"body": params,
を"body": JSON.stringify(params)
に変えてみたりもしてみたが、同じエラーだった。
考察
大抵バグるときは私のせいである。だから公式API net.request は動くと信じたい。現にGitHub APIのusersは叩けた。
なのにGitHub APIをusersからcreateRepoに変えるとnet:ERR_CONNECTION_REFUSED
エラーになる。原因として考えられるものは上記記事と違うコード部分にあるはず。違いを列挙すると以下。
GET
→POST
- users→createRepo
- パラメータを渡す必要がある
そこで影響ありそうなところはすべて試してみたつもりだが、同じエラーだった。
一体https.requestのときと何が違うというのか。
もしやnet.request固有の問題なのか? Electron APIであるnet.requestは、Node.js APIであるhttps.requestを使わずに実装しているのかもしれない。だからhttps.requestでは成功するけど、net.requestではエラーになるのかな?
そもそもコンソールにエラーが出るわけでもなく、例外発生するでもなく、ダイアログでエラー表示されるので驚いた。JavaScript文脈よりもっと低レベルなところでエラーになっているのかもしれない。たとえばネットワークが切断されているとか。でも、そんなことはないのは確認済み。あるいはよく知らないけど、SSL/TLSのようなセキュリティ周りが古いとか? ネットワークにおける深い知識がないのでこれ以上想像できない。
net:ERR_CONNECTION_REFUSED
エラーは原因不明のため、これ以上は調査不能。
仮にこれが解決したところで、HTTPリクエスト後の処理を実装できない問題の調査にある問題があるため、まともに使えないし。
Electronでネット通信する方法
原因不明なのはモヤモヤするが、対処としては次のいずれかに限られるようだ。
- 第三者製ライブラリを使う
- Node.js の fetch API 使える版v18がLTSになるのを待つ
ここまで調べたのだから、もう標準APInet.request, https.requestの使用は諦めるべきタイミングだろう。信じるものは裏切られる。