ほりひログ

所属組織の製品 (Azure とか) に関連する内容が多めだけど、個人の見解であって、所属組織を代表する公式情報ではないです。

node-fetch で、GETしたコンテンツをそのまま他所にPOSTする

当たり前すぎるのか、探し方が悪いのか、サンプルが見当たらなかったので、メモとして。

HTTP GET 等で取得したコンテンツを、他の URL に POST する際に、ローカルでファイル化しない方法がないか探してました。

で、行きついたのが下記のコード。

node-fetch を使っています。

www.npmjs.com

const fetch = require('node-fetch');

fetch(`${GET_URL}`, {
  method: 'GET',
  /*
  Headers 等、その他のパラメータ
  */
}).then(response => {
  return fetch(`${POST_URL}`, {
    method: 'POST',
    body: response.body,
    /*
    Headers 等、その他の(ry
    */
  });
});

# async/await よりも Promise 派

最初の fetch で取得した response の body が、readable stream になっているはずなので、そのまま次の fetch のリクエスト body に設定しているだけです。

何に使うの?

LINE bot で、投稿された画像を他所の Web API を使って処理させたくなりまして。

一応、その Web API には、画像の URL を渡せすことも可能なのですが、LINE Bot の場合、コンテンツにアクセスする場合には、Authorization ヘッダーにアクセストークンを指定する必要があるので、その Web API に URL を渡しても、Web API 側から画像を取得することが無理ってことに。

developers.line.biz

そんな訳で、コンテンツを代わりに取ってきて、Web API に POST してあげないといけなかったのですが、ローカルに保存するのがちゅうちょする環境だったので、結局、上のコードのように、ストリームをそのまま渡す、というやり方に落ち着いた次第でして。