Fetch API入門
kintoneプラグイン開発入門の途中なのですが、kintoneのレコードに添付されたファイルをダウンロードしてチェックする機能が作れると幸せになれそうな状況になりました。幸せになりたいので、がんばります。
幸せになるための準備
kintoneのレコードに添付されたファイルのダウンロードには、ファイルダウンロードAPIを使えば良いようです。このAPIを使って、kintoneのレコードに添付されたファイルを、GitHub Actionsで作業用ディレクトリにダウンロードして、チェックを実行したいと思いました。
kintoneのレコードに添付されたファイルのダウンロード方法
kintoneのファイルダウンロードAPIは、普段スライド公開や動画公開で利用しているkintone JavaScript APIが使えないようです。代わりに、Fetch APIを使って実行することができることがわかりました。REST APIは使ったことがありますが、Fetch APIは使ったことがありません。まずは、Fetch APIの使い方を学習しなければなりません。
事前準備
Fetch API はリクエストやレスポンスを操作する要素にアクセスするための JavaScript インターフェイスです。ファイルを取得するためのリクエストは、fetch()メソッドを呼べば良いようです。fetch()をGitHub Actionsで実行する前に、ローカルで試したいと思います。kintone開発者環境に、テスト用のアプリを作成しました。このアプリに添付ファイルを登録して、その添付ファイルがダウンロードできれば成功です。
fetchAPIを使う前に、改めてPromiseについてmdnのドキュメントを読んで、ふんわりとイメージしていたものが、理解できました。(誰かに説明できるかどうかは、怪しいですが)
Fetch APIを使う手順
ファイルをダウンロードするためには、アプリのAPIトークンの他に、添付ファイルのファイルキーが必要です。アプリのAPIキーは、アプリの設定画面で取得できるのですが、ファイルキーはアプリの画面からは取得できません。添付ファイルのファイルキーの取得手順は、「ファイルダウンロードで必須となる 2 つの手順」に説明があります。対象レコードを取得すると、添付ファイルの情報として、ファイルキーを取得することができます。
pdf: { type: 'FILE', value: [ [Object] ] } ←この[Object]に設定されている
上記のObjectを展開すると、下記の内容が格納されています。
{
fileKey: 'ファイルキー文字列', ←このファイルキー文字列を使用する
name: 'ファイル名.pdf',
contentType: 'application/pdf',
size: '3083043'
}
ということは、複数のレコードを処理する場合、取得したレコードの添付ファイル情報をもとに、ファイルをダウンロードすればOKです。
ああ、やっぱり理解が足りない!😭
async function getFile(key, name, contentType){
try{
const headers = {
'X-Requested-With': 'XMLHttpRequest',
};
const resp = await fetch(`https://1lc011kswasj.cybozu.com/k/v1/${name}?fileKey=${key}`, {
method: 'GET',
headers,
})
.then((resp) => {
const savePath = `temp/${name}`;
const distStream = createWriteStream(savePath);
resp.body.pipeTo(distStream);
console.log(`ファイル書き出しOK=>${name}`);
});
}
catch (err) {
console.error(err);
}
}
fetchのレスポンスがReadStreamとして利用できるので、これをWriteStreamに変換できればOKだと思ったのですが、出力先のパスを指定して生成したWriteStreamでは出力できないようです。ここがクリアできなければ、ファイルが保存できません。
TypeError [ERR_INVALID_ARG_TYPE]: The "transform.writable" property must be an instance of WritableStream. Received an instance of WriteStream
続きはまた次回
今日中にkintoneのレコードから取得したファイルを保存できるところまで進めたかったのですが、StreamAPIのことをもう少し調べないといけません。煮詰まったときには、一晩寝かせて冷静になると良さそうです。このままでは幸せになれないので、引き続き精進します。