LoginSignup
2
1

More than 1 year has passed since last update.

Cloud Functions for Firebaseでリクエストbodyが消失する問題でハマった。

Last updated at Posted at 2022-07-04

Cloud Functions for Firebaseでリクエストbodyが消失する問題でハマった。

Cloud Functions for Firebaseでリクエストbodyが消失する問題でハマったので、同じ轍を踏む人がいない様に共有。

結論

クライアント側のContent-typeが重複して定義されていた。

Content-Type: application/json,application/json

現象

Cloud Functions for Firebaseでリクエストbodyが消失した。
消失したとは、functions.https.Requestのbodyプロパティが空のオブジェクトになっている。

状況

  • JSONをInputとして受け付けるAPIをCloud Functions for Firebase上で運用していた。
  • 内部のサービスから突然リクエストbodyが空のリクエストが来る(起きたり起きなかったりする。)
  • クライアント側のコードを見ても確実にリクエストbodyは付与している。
  • Cloud Functions for FirebaseはNode.js 16で動かしており、expressなどのFWは利用していない。

対策

クライアント側で Content-Type の重複を取り除いてもらった。

なぜ

body-parserの仕様だから。
Cloud Functions for Firebaseではbody-parserを利用している。1
body-parserでは、application/json,application/json はjsonとしてみなされないためこの様になる。

具体的にはbody-parser内で利用しているtype-isが以下の様に重複している場合はfalse扱いになる。
そのため、jsonとしてパースされず、リクエストbodyが空扱いとなる。

const typeis = require('type-is');

const contentType = "application/json,application/json";
const request = {headers: {"content-type": contentType, "content-length": 1}};

console.log(typeis(request, ['application/json'])); // false

蛇足

発生したりしなかったりするのはなぜ?

GCPのサポートに聞いたところ、Cloud Functionsの内部バックエンドに依存して古いバージョンであればその問題は発生しないけど、新しくなると発生する。
全てのインスタンスが自動的に新しいバージョンになるわけではないので、発生したり発生しなかったりしたということでした。

宣伝

株式会社オプティマインドでは、一緒に働く仲間を大募集中です。
カジュアル面談も大歓迎ですので、気軽にお声がけください。

【エンジニア領域の募集職種】
ソフトウェアエンジニア
QAエンジニア
Androidアプリエンジニア
組合せ最適化アルゴリズムエンジニア
経路探索アルゴリズムエンジニア
バックエンドエンジニア
インフラエンジニア
UXUIデザイナー

【ビジネス領域の募集職種】
セールスコンサルタント
オペレーションコンサルタント

『オプティマインドってどんな会社?』については、こちらから
Wantedlyでもこちらで募集中

  1. https://firebase.google.com/docs/functions/http-events#read_values_from_the_request

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1