为什么我的lambda仅在我给某些消息回叫时才起作用?

时间:2018-11-05 18:30:30

标签: node.js aws-lambda

我正在尝试运行一小段lambda代码,其中我正在使用firehose将数据推送到S3。这是我的代码段

const AWS = require( 'aws-sdk' );
var FIREhose = new AWS.Firehose();
exports.handler = async (event,context,callback) => {
    // TODO implement
    const response = {
        statusCode:200,
        Name:event.Name,
        Value:event.Value
    };
const params = {
  DeliveryStreamName: 'kinesis-firehose', 
  Record: { Data: new Buffer(JSON.stringify(response)) }
};

FIREhose.putRecord(params, (err, data) => {
if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);
});
};

这是我的活动

{
  "Name": "Mike",
  "Value": "66"
}

当我运行此lambda时,我得到的响应为null。由于我没有传递任何回调,因此lambda将默认运行隐式回调并返回null。我看到没有数据推送到S3存储桶。 但是当我像这样在末尾添加callback(null,"success")

FIREhose.putRecord(params, (err, data) => {
if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);
});
callback(null,"success")
};

我看到数据被推送到S3。这是为什么 ? async函数是否总是需要附加一些文本的回调? 任何帮助表示赞赏吗? 谢谢

1 个答案:

答案 0 :(得分:0)

这里的问题是您正在混合使用node.js lambda模式。

可以使用异步函数并返回或抛出:

exports.handler = async (event,context,callback) => {
  // code goes here.

  await FIREhose.putRecord(params).promise();
  return null; // or whatever result.
};

,您可以使用回调方法:

exports.handler = (event,context,callback) => {
  // code goes here.

  FIREhose.putRecord(params)
    .promise();
    .then((data) => {
      // do stuff with data.
      // n.b. you could have used the cb instead of a promise here too.
      callback(null, null); // or whatever result.
    });
};

(使用context.的第三种方法,但这是非常的传统方法)。

这都是由于lambda的工作原理以及何时检测到响应所致。

在您的第一个示例中(没有回调),lambda期望您的处理程序返回一个必须等​​待解析/拒绝的承诺,而该承诺又将是响应。但是,您没有返回承诺(undefined),因此没有什么可等待的,它可以立即返回-很可能在putRecord调用完成之前。

不过,当您使用callback时,您明确告诉lambda您正在使用“旧”方式。关于callback方法的有趣之处在于,它等待等待节点的事件循环完成(默认情况下)。这意味着.putRecord可能会完成。