NIFCLOUD-mbaas / UserCommunity

ニフクラ mobile backend ユーザーコミュニティ
https://mbaas.nifcloud.com/
81 stars 18 forks source link

スクリプトで外部APIの結果サイズが大きいとエラーになる。 #1251

Open motoyama-yusuke opened 3 years ago

motoyama-yusuke commented 3 years ago

外部APIを呼び出すスクリプトを作っていたところ、Scriptエラーとなりました。 いろいろ試した結果、何かのサイズ制限にあるように見えています。 ご存じの方いましたら教えて下さい。

実施内容

質問

goofmint commented 3 years ago

こちら再現できるコードなどあるでしょうか? https://api.github.com/repos/NIFCLOUD-mbaas/UserCommunity/issues?per_page=19 を取得しようとするとエラーになるでしょうか?

システム要件上ではそのようなことがなく、原因が不明な状況のようです。

motoyama-yusuke commented 3 years ago

@goofmint さん

以下スクリプトで、Queryパラメタper_pageを指定して実行しています。 先程試したところ、per_page=17を超えるとエラーとなります。

const request = require('superagent');

module.exports = async (req, res) => {
  const response = await request
    .get('https://api.github.com/repos/NIFCLOUD-mbaas/UserCommunity/issues?per_page='+req.query.per_page)
    .send();
  res.send({
    status: response.status,
    body: response.text
  });
}

補足.

質問に上げた後、こちらでもいろいろ試し、 res.sendのbodyサイズに制限があるようなところまでは追いかけました。

試したこと

  1. res.sendのbodyを固定値に変更 → OK だがresponse.textを扱ってないので検証に値せず。。
  2. 内部でJSON.parse(response.text);をして、issueのurlのみ配列をbodyに設定 → OK 上記より、httpをget時は問題なし。内部の文字列処理もおそらく問題なし。
goofmint commented 3 years ago

ああ、per_page ですね。つまり数を大きくするとデータ量が増えているということですね。

以下のようなコードにすると、per_page = 18 までいけます。

const request = require('superagent');

module.exports = async (req, res) => {
  try {
    const response = await request
      .get('https://api.github.com/repos/NIFCLOUD-mbaas/UserCommunity/issues?per_page='+req.query.per_page)
      .send();
    res.send(response.text);
  } catch (e) {
    res.send(e);
  }
}

他のコードでも試してみた限り、以下の部分は通過しています。なのでGitHubからのレスポンスの問題ではなさそうです。

const response = await request
  .get('https://api.github.com/repos/NIFCLOUD-mbaas/UserCommunity/issues?per_page='+req.query.per_page)
  .send();

となると per_page = 17 にした時に 64KBを超えているようなので、そのあたりにシステム制限がありそうな気がします。

goofmint commented 2 years ago

こちら、64KBまでというのが仕様だそうです。後日ドキュメントにも反映されます。

motoyama-yusuke commented 2 years ago

@goofmint さん

情報ありがとうございます!

前回のコメントで、64KBというありがちな数字だったので、どこかに制限あるものと判断して、 調査は中断し、回避する方向にしていましたが、コメントなど書き込みできていませんでした。 すみません。

仕様ということが明確になり、スッキリしました。