LoginSignup
7
4

More than 3 years have passed since last update.

HTTP APIでLambda関数にPOSTしたbodyの値が '[object Object]' になる時の解決法

Last updated at Posted at 2020-05-19

AWS Lambdaの関数にHTTP APIで値をPOSTする際につまづいたのでメモ。

環境

  • macOS
  • AWS Cloud9
  • Node.js 12

問題

Node.jsのfetch()メソッドで、自作したAWS Lambda関数にPOSTで値を送信しました。
Lambdaの呼び出しはAPI GatewayのHTTP APIを用いています。

Lambda関数のコード

デバッグするために、Lambda関数では一旦eventを返すようにしています。
console.logで出力してCloudWacth Logsで確認しても良いと思います。

exports.handler = async(event, context) => {
    console.log(event)
    ...
    return event
};

実行コード

require('dotenv').config()
const env = process.env

var fetch = require("node-fetch")

fetch(env.LAMBDA_URL, { // Lambda関数のAPI URL
        method: 'POST',
        headers: {
            'Content-type': 'application/json'
        },
        body: {
            "massage": "test massage"
        },
    })
    .then(function(res) {
        return res.json();
    })
    .then(function(event) {
        console.log(event);
    })

eventの中身を確認すると、

{
version: '2.0',
routeKey: 'XXXXXXXXXX',
...
body: '[object Object]',
isBase64Encoded: false 
}

bodyの値が'[object Object]'になっています。

解決方法

どうやら、Lambda関数に渡すPayloadは、文字列として渡す必要があるようで、JSON形式のデータはJSONの文字列に変換した状態で送る必要があるようです。
Payloadに指定した値は文字列に変換されるので、JSONオブジェクトをそのまま指定すると、[object Object]に変換されてしまいます。
※オブジェクトにtoString()メソッドを適用すると、返り値は[object Object]なる

POSTするbodyの値を、JSON.stringify()で文字列に変換して送ることで解決できます。

修正後のコード

fetch(env.LAMBDA_URL, {
        method: 'POST',
        headers: {
            'Content-type': 'application/json'
        },
        body: JSON.stringify({ // JSONを文字列に変換する
            "massage": "test massage"
        }),
    })
    .then(function(res) {
        return res.json();
    })
    .then(function(event) {
        console.log(event);
    })

出力を見てみると、

{
version: '2.0',
routeKey: 'XXXXXXXXXX',
...
body: '{"massage":"test massage"}',
isBase64Encoded: false 
}

POSTしたbodyの値をきちんと確認できました。

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4