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の値をきちんと確認できました。