Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8691

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

$
0
0

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

環境

  • macOS
  • AWS Cloud9
  • Node.js 12

問題

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

Lambda関数のコード

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

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

実行コード

require('dotenv').config()constenv=process.envvarfetch=require("node-fetch")fetch(env.LAMBDA_URL,{// Lambda関数のAPI URLmethod:'POST',headers:{'Content-type':'application/json'},body:{"massage":"test massage"},}).then(function(res){returnres.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に指定した値は文字列に変換されるので、オブジェクトをそのまま指定すると、[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){returnres.json();}).then(function(event){console.log(event);})

出力を見てみると、

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

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


Viewing all articles
Browse latest Browse all 8691

Trending Articles