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でもこちらで募集中