我正在尝试运行一小段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
函数是否总是需要附加一些文本的回调?
任何帮助表示赞赏吗?
谢谢
答案 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
可能会完成。