【问题标题】:What's the right way to return from an AWS Lambda function in Node.js?从 Node.js 中的 AWS Lambda 函数返回的正确方法是什么?
【发布时间】:2019-07-04 16:32:21
【问题描述】:

我是 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";
}

这些有何不同?任何功能或性能差异?

谁能解释一下如何以正确的方式终止函数?

【问题讨论】:

  • 回调允许您使用处理程序的当前上下文执行代码。 return 允许您返回一个值,该值可以在您调用函数的位置进行评估。另外两个,我不太确定,所以我会告诉你看一下文档
  • @Izio 我的问题是什么是正确的方法。还是谢谢!
  • 答案取决于你想要达到的目标
  • @Izio 我只想从 Lambda 函数返回一个值。我问的是最佳实践...

标签: node.js aws-lambda


【解决方案1】:

您可能正在使用 Node.js 8.10,这是迄今为止 AWS Lambda 支持的最后一个 Node.js 版本,否则最后一个 (4.) sn-p 根本不起作用(由于语法错误)。

在 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);
    });    
}

尽管如此,这个函数具有一般使用回调的所有缺点(回调地狱)。

在 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();
}

这会产生更短、更优雅的代码,对人类来说更具可读性。

当然,最后你可以选择你喜欢的,只要对比你的例子sn-ps...

【讨论】:

  • 可以省略 await 语句,直接返回 s3.getObject(params).promise() 吗?
  • @rjobindon 是的,在这种情况下你可以这样做,我只是想演示 async/await 的用法。我会稍微修改一下这个例子。
  • @ttulka 这对 lambda@edge 也有效吗?
猜你喜欢
  • 2021-10-30
  • 2020-10-17
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 2019-12-30
  • 2011-09-08
  • 1970-01-01
相关资源
最近更新 更多