【Nodejs】Lambdaのテストでevent.bodyのJsonがSyntaxErrorになる

#JavaScript
writtdden by ま。

こんにちは、ま。です

NodejsでとあるAPIを作成してた時にLambdaコンソールから動作テストしようと思ったらSyntaxError。。。
Lambdaコンソールのテストからだと失敗して、APIGatewayのコンソールからはテストできるので???です。

Gateway組んでからでも良いのですが、Lambdaテストはコンソールにテストリクエストの内容も残せるし、そっちでやりたいので調べてみました。

準備

環境については前述の通りAPIGateway(REST)からPOSTリクエストで呼び出す想定でLambda関数を作成します。
言語はNode.js 14です。Nodeであればこの事象そのものにバージョンは関係ありません。

まずは関数のコード。
とりあえずPOSTを受けれればいいのでこれだけにしておきます。

exports.handler = async (event) => {
    const body = JSON.parse(event.body);
    console.log('foo:', body.foo);
    console.log('bar:', body.bar);

    const response = {
        statusCode: 200,
        body: JSON.stringify(body.foo + 'と' + body.bar),
    };
    return response;
};

リクエストはLambdaコンソールテストでAPIGateway AWS Proxyのデフォルトからbodyだけそれっぽく。

2行目にあるBodyの内容がコンソールに書き出されればOKという関数です。

事象の確認

早速実行してみます。

というわけなんですよね。

結論:文字列にしてやれ

なぜこうなるかというとevent.bodyがJson文字列なのかJsonオブジェクトなのかという違いです。

コード内ではJsonオブジェクトとして参照したいので、関数の最初に

const body = JSON.parse(event.body);

と、Jsonオブジェクトにしますよーと書いています。
対してbodyを見ると

"body" : { "foo": "1番", "bar": "2番"},

既にオブジェクトの形ですね。
Json.parseは文字列をオブジェクトにしたいので、できないよこれ!って言ってるわけです。

というわけで文字列にリクエストを変更します。

エスケープ。。。

テスト実行すると

成功したけど、パラメータの数増えたらめんどくさいですね。

おまけ

じゃあ逆にJson.parseしなくていいんじゃね?って思うのでやってみました。

Lambda

リクエスト

結果

当然と言えば当然ですがLambdaテストは成功します。

じゃあ先に進んでAPIGatewayでテストしてみます。
構築は画面は割愛しますが、APIGatewayからPOSTメソッドを指定し、先ほどの関数を呼び出せるようにして、
APIGatewayのテストツールでテストします。

リクエスト本文は以下

{
    "foo": "1番",
    "bar": "2番"
}

結果

 

undefinedと言われてしまいました。

どうやらAPIGatewayのevent.bodyはJsonオブジェクトに対応してないようで、
リクエスト本文に書いたオブジェクトは文字列に変換されて送られているみたいです。

Lambdaからテストできたのは単純にLambdaのテストではそういう変換は行われず、入力したままの内容を冠すに読み込ませてるんでしょうね。

きっとLambdaテストはNodeに優しくない世界なんだなぁって思いました笑

AWS Lambda

その他のAWS記事

AWSのストレージ6種類を比較!−概要編−

AWSについて~EC2の作成~

Favorite