node.js - 从Node.js中的AWS Lambda函数返回的正确方法是什么?

标签 node.js aws-lambda

我是AWS Lambda的新手,有一件事我感到非常困惑。

到目前为止,我发现了以下选项如何从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";
}

这些有什么不同?功能或性能上有区别吗?

谁能解释如何以正确的方式终止的功能?

最佳答案

您可能正在使用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);
    });    
}

但是,此函数具有通常使用回调(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();
}

从而产生更短,更优雅的代码,人类更容易理解。

当然,最后您可以选择自己喜欢的内容,只需比较示例片段即可。

关于node.js - 从Node.js中的AWS Lambda函数返回的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54626183/

相关文章:

javascript - 每次循环存储随机顺序的数组

javascript - Node JS : Request Loop Until Status Code 200

amazon-web-services - 如何在AWS Lambda上安装fontconfig?

amazon-s3 - AWS S3 CopyObjectAsync 失败, key 不存在,但获取/放置成功

python-3.x - lambda 函数上的 aws-xray-sdk

amazon-web-services - 运行 AWS Golang Lambda 时出现 exec 格式错误

javascript - 可以在 NodeJS/Javascript 中使用 while/for 循环将此递归代码编写为迭代代码吗

node.js - 使用 nodejs child_process 进行 ssh,在服务器上找不到命令

java - 尝试处理 s3 文件时出现 OOM

javascript - PhoneGap 应用程序上 Apache Cordova 的 Windows Azure 通知中心插件 - WindowsAzure 未定义