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