【Node.js】Lambdaのevent.body.fooがunderfindになる

Lambdaを使っていたときに、実行時にinputに次のようなjsonを渡してLambdaを実行して、そのjsonを受取る処理を書いていました。

{"domain": "ハックノート hacknote.jp"}

このinput自体はevent.bodyに入っていて、”ハックノート hacknote.jp”を取得したい場合はevent.body.domainとすれば取得できます。(これはjsの文法のお話)

これが罠です。

以下のようなコードを実行した場合はどのようになるでしょうか

module.exports.main = async (event) => {
  console.debug('event:', event)
  console.debug('event.body:', event.body)
  console.debug('event.body.domain:', event.body.domain)

想定される結果

event: {~~~~~eventの大量のjsonが表示される~~~~~~~}
event_body: {{"domain": "ハックノート hacknote.jp"}}
event.body.domain: ”ハックノート hacknote.jp”

実際の出力

event: {~~~~~eventの大量のjsonが表示される~~~~~~~}
event_body: {{"domain": "ハックノート hacknote.jp"}}
event.body.domain: underfind

はい。おかしいですね…
これはevent.body.domainがjsonとして解釈されていないことが原因です。
以下のようにJSON.parse()関数でjsonとして解析できるようにしてあげればOKです

module.exports.main = async (event) => {
  console.debug('event:', event)
  // jsonをパース
  const event_body_json = JSON.parse(event.body);
  console.debug('event_body_json:', event_body_json);
  console.debug('event_body.domain:', event_body.domain);

おわりに

serverless frameworkを使っていたので、ローカル実行時には正常にevent.body.domainが出力されるのに、Lambdaで実行するとunderfindになってしまうという現象に頭を悩ませておりました…
eventのjsonをよく読んだ結果気づくことができました。ローカルとリモートで実行結果が違うのやめてくれ〜〜