Bar*_*ney 1 node.js aws-lambda
我是AWS Lambda的新手,有一件事我感到非常困惑。
到目前为止,我发现了以下选项如何从Node.js中的函数返回:
1。
exports.handler = (event, context) => {
context.succeed('ok');
}
Run Code Online (Sandbox Code Playgroud)
2。
exports.handler = (event, context) => {
context.done(null, 'ok');
}
Run Code Online (Sandbox Code Playgroud)
3。
exports.handler = (event, context, callback) => {
callback(null, 'ok');
}
Run Code Online (Sandbox Code Playgroud)
4。
exports.handler = async event => {
return "ok";
}
Run Code Online (Sandbox Code Playgroud)
这些有什么不同?功能或性能上有区别吗?
谁能解释如何以正确的方式终止功能?
您可能正在使用Node.js 8.10,这是迄今为止AWS Lambda支持的最新Node.js版本,否则最后一个(4.)代码段将根本无法工作(由于语法错误)。
在Node.js 8.10中,上面列出的所有变体均有效,但大多数变体仍然存在,仅是为了与早期运行时版本兼容。
第一拳(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);
});
}
Run Code Online (Sandbox Code Playgroud)
但是,此函数具有通常使用回调(Callback Hell)的所有缺点。
在Node.js 8.10上,您可以将Promises与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();
}
Run Code Online (Sandbox Code Playgroud)
从而产生更短,更优雅的代码,人类更易读。
当然,最后您可以选择自己喜欢的内容,只需比较示例片段即可。
| 归档时间: |
|
| 查看次数: |
1074 次 |
| 最近记录: |