私は AWS Lambda を初めて使用するのですが、非常に混乱する点が 1 つあります。
これまでのところ、Node.js の関数から戻る方法として次のオプションを見つけました。
1.
exports.handler = (event, context) => {
context.succeed('ok');
}
2.
exports.handler = (event, context) => {
context.done(null, 'ok');
}
3.
exports.handler = (event, context, callback) => {
callback(null, 'ok');
}
4.
exports.handler = async event => {
return "ok";
}
これらはどう違うのでしょうか? 機能やパフォーマンスに違いはありますか?
関数を終了する方法を説明できる人はいますか?正しい方法?
ベストアンサー1
おそらく、AWS Lambda でサポートされている Node.js の最新バージョンである Node.js 8.10 を使用していると思われます。そうでない場合、最後の (4.) スニペットはまったく機能しません (構文エラーのため)。
Node.js 8.10 では、上記のすべてのバリアントが有効であり、そのほとんどは以前のランタイム バージョンとの互換性のためだけに残っています。
最初の 2 つ (1. と 2.) は最も古いもので、現在では使用することは推奨されていません。 関数は、done(err?, res?)
後に追加された と同等でcallback(err?, res?)
、Node.js 8.10 より前に頻繁に使用されており、公式ドキュメントでも多くのコード例を見つけることができます。これは典型的なコールバックであり、非同期処理で使用できます。
exports.handler = (event, context, callback) => {
var params = {
Bucket: "examplebucket",
Key: "HappyFace.jpg"
};
s3.getObject(params, function(err, data) {
if (err) return callback(err);
callback(null, data);
});
}
ただし、この関数には、一般的なコールバックの使用に伴うすべての欠点 (コールバック地獄) があります。
Node.js 8.10 以降では、Promise をシンタックスシュガーと一緒に使用してasync/await
、非同期計算を同期のように見せることができます。AWS JavaScript SDK では、これまでコールバックを使用していたほぼすべての関数に関数が追加されましたpromise()
。これで、次のように記述できます。
exports.handler = async event => {
var params = {
Bucket: "examplebucket",
Key: "HappyFace.jpg"
};
var data = await s3.getObject(params).promise();
// here you process the already resolved data...
return data;
// or you can omit `await` here whatsoever:
// return s3.getObject(params).promise();
}
これにより、人間にとってより読みやすい、より短くエレガントなコードが生成されます。
もちろん、最後には好きなものを選択できます。サンプル スニペットを比較するだけです...