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をよく読んだ結果気づくことができました。ローカルとリモートで実行結果が違うのやめてくれ〜〜