anz blog

Cloud Functions の Request で rawBody 取れた件

ざっくりまとめ。

  • Request から raw-body みたいの取りたい
    • 以前の記事で取れないからとかいって自分で構築しなおしていた
  • 実はとれる
  • request.rawBody でいい(公式docにもあるとおり)
    • ただし、TypeScript だと、rawBody というプロパティはないと怒られる(型!)
    • その警告を無視する勇気が必要(笑)

です。

環境

  • firebase-tools v6.3.0
  • firebase-functions v2.1.0

やりたいこと

request の body がほしい(json オブジェクトにパースされる前のもの)

方法

公式ドキュメントにあるとおり、
request.rawBody
で取得できます!💪

ただし!
これは開発環境にもよるのですが、
TypeScript で開発していると request.rawBody とやった瞬間に怒られます。
RequestrawBody というプロパティは存在しないと。
なので、僕は前回の記事で取得できないとかなんとか言っていたわけですが...
Request とはいえ、所詮 Object でしょ?っていうのりで、
request['rawBody'] とブラケット記法にすると怒られることもなく取得できます。。😇

なんかなー感はありますが。。

前回の記事のままでもよかったのでは?

簡単な body ならそれでもよかったのですけれど、
SlackBot で連携していると、送られてくる body はどんどん複雑化してきて、
前回紹介したやりかたでは、全然対応しきれなくなったので、再度トライしました(笑)

URLSearchParams でも少し頑張ってみたり

自分でいちいちまわさなくても const params = new URLSearchParams(req.body) と渡す事もできるということをしったので、その方法でもやってみたのですけれど、
この方法でもやはり複雑なものは対応できないたみたいでした。

raw-body で取り直す

ググっていると、raw-body をつかって Request から取得しなおすみたいな例をみたのでやってみたのですが、
これもだめでした。(やり方がアカン説は根強い。。)
getRawBod(req) とうやり方で取れるはずなのだけれど、abortされるのです
abort される理由としては指定した Request のストリームがすでに閉じられているからっぽいですかね。

でも、こちらの方法で取得してやったというサンプル事例もいくつかみたので、
僕がなんらか間違っている可能性は高そうではあります。。
とはいえ、最初に紹介したとおり、ブラケット記法であれば取れるのでそっちがもっともシンプルかもしれませんが。

参考