createRepoが実行できた。JSONをブラウザ側に返せた!
ブツ
インストール&実行
NAME='Electron.Axios.HelloWorld.20220824102245'
git clone https://github.com/ytyaru/$NAME
cd $NAME
npm install
npm start
準備
npm start
でアプリ起動し終了する(db/setting.json
ファイルが自動作成される)db/setting.json
に以下をセットしファイル保存するusername
に任意のGitHubユーザ名token
にrepo
スコープ権限を持ったトークンrepo
に任意リポジトリ名(mytestrepo
等)
dst/mytestrepo/.git
が存在しないことを確認する(あればdst
ごと削除する)- GitHub上に同名リモートリポジトリが存在しないことを確認する(あれば削除する)
もし同名リモートリポジトリが存在していると422エラーになる。
実行
npm start
で起動またはアプリでCtrl+Shift+Rキーを押す(リロードする)git init
コマンドが実行されるrepo/リポジトリ名
ディレクトリが作成され、その配下に.git
ディレクトリが作成される
- createRepo実行後、端末に以下のような成功メッセージが表示される
ドキュメント
コード抜粋
main.js
const axios = require('axios');
ipcMain.handle('axiosPost', async(event, url, data, config)=>{
const res = await axios.post(url, data, config).catch(e=>console.error(e));
return res
})
上記コードだと開発者コンソールに以下のようなエラーが表示される。
Error: Error invoking remote method 'axiosPost': Error: An object could not be cloned.
HTTPリクエスト後の処理を実装できない問題の調査のとおり、IPC通信におけるシリアライズ制約が原因である。
このエラーが出るにもかかわらず、なぜかGitHub上でリモートリポジトリ作成には成功する。意味不明。
なんかAPIやライブラリごとに挙動がすべて違うな……。
エラーの原因を分析してみる。リポジトリ作成できていることからAPIの発行までは成功しているはず。それ以降でエラーになっているということは、もうreturn res
しかない。そしてエラー内容はシリアライズ制約にひっかかったことを意味するAn object could not be cloned.
。となると戻り値のres
の中に関数などシリアライズ不可能な何かが入っているのかな?
axios responseをみてみると、すべてオブジェクトに見える。問題なさそうだけど、その配下に関数が含まれているのかもしれない。とりあえずAPIレスポンスとして返されるJSONオブジェクトさえ返せればいい。それらしいのはres.data
だろう。以下のようにコードを修正した。
const axios = require('axios');
ipcMain.handle('axiosPost', async(event, url, data, config)=>{
const res = await axios.post(url, data, config).catch(e=>console.error(e));
return res.data
})
これで実行するとエラーがなくなり成功した! ちゃんとrenderer.js
側にもJSONを返せた! これがやりたかった!
preload.js
axiosPost:async(url, data, config)=>await ipcRenderer.invoke('axiosPost', url, data, config),
renderer.js
const res = await window.myApi.axiosPost(
`https://api.github.com/user/repos`,
{
'name': `${setting.github.repo}`,
'description': 'リポジトリの説明',
},
{
'headers': {
'Authorization': `token ${setting.github.token}`,
'User-Agent': `${setting.github.username}`,
'Content-Type': 'application/json',
}
}
).catch(e=>console.error(e));
console.log(res)
ちゃんとres
でGitHub APIの戻り値であるJSONが取得できた! アプリの開発者ツールのコンソールに表示される。
これでやっとHTTPリクエスト後の処理が実装できそうだ。