Function Compute + API GatewayでPOSTのエンドポイントを作る
アリババクラウド のFunction Compute + API GatewayでPOSTのエンドポイントを作ってリクエストボディを拾うのが大変でした。
今回のソースコード
// index.js const atob = require('atob'); const createMessage = (parameters) => { // データを保存するなりなんなりと } module.exports.handler = (event, context, callback) => { const query = JSON.parse(event.toString('utf8')) createMessage(JSON.parse(atob(query["body"]))); callback(null, { statusCode: 201, body: 'success!' }); };
ここでポイントが2つあります。
fc-helper
のhook
は使うことができない- リクエストボディを拾うのに手間がかかる
それぞれに関して補足します。
fc-helper
のhook
が使えない
hookを使うときはhook(async (ctx) => {})
のようなインターフェイスで使うのですが、API GatewayからFunction Computeにリクエストボディが渡らないためにctx.req
が空になってしまうので使い物になりません。
ですので(event, context, callback) => {})
のスタイルを使いましょう。
fc-helper
使えないならテストがめんどくさいですね・・・
改善を期待します。
リクエストボディを拾うのに手間がかかる
やたらと遠くにいて拾いにくいです。
> const request = JSON.parse(event.toString('utf8')) {"body":"CxxxxxxxxxxxxogInxxxxxxxxxxlIGJvZHkgfSB9In0K","headers":{"X-Ca-Api-Gateway":"101CFC98-4F9C-46EF-BBDF-36D280F45D33","X-Real-IP”:”xxx.xxx.xxx.xxx”,”X-Forwarded-Proto":"http","X-Forwarded-For":"xxx.xxx.xxx.xxx","User-Agent":"curl/7.54.0","Content-Type":"application/json","Accept":"*/*","CA-Host":"10ba8f4b3ea74xxxxxx0e5c4-cn-shanghai.alicloudapi.com"},"httpMethod":"POST","isBase64Encoded":true,"path":"/","pathParameters":{},"queryParameters":{}} > atob(request["body"]) CxxxxxxxxxxxxogInxxxxxxxxxxlIGJvZHkgfSB9In0K
さらに注意
本題とはあまり関係ありませんが、callback
の引数に気をつけましょう。第二引数のオブジェクトのstatusCode
とbody
は必須です。
API GatewayのmethodをPOSTにするのを忘れないようにしましょう。template.yml
を使いまわしてGETのままで少し詰まりました。