我编写了以下Twilio函数,以将数据加载到S3存储桶中。
但是,根本没有数据到达S3。
怎么了?
exports.handler = function(context, event, callback) {
callback(null,
putFile(
getParams(context, event)
)
);
};
function getParams(context, event) {
return {
Bucket: 'my-bucket',
Key: 'my-file.json',
Body: JSON.stringify(event),
ContentType: 'application/json'
};
}
function putFile(params) {
var aws = require('aws-sdk');
var s3 = new aws.S3();
s3.putObject(params, (err, res) => {
if (err) console.log(`s3-err: ${err}`);
if (res) console.log(`s3-res: ${JSON.stringify(res)}`);
});
}
答案 0 :(得分:2)
我的问题的答案在这里: https://www.twilio.com/docs/runtime/functions/invocation#callback-and-asynchronous-limitations
回调和异步限制
请务必注意,在调用回调函数时,它会 将终止您所有的功能执行。这包括任何 您可能在启动过程中启动了异步进程 执行处理程序。
因此,如果您使用的是本机库 异步的,您需要嵌套对回调函数的调用 在承诺处理程序中。
因此,基本上,callback();
需要放置在对S3的请求成功响应中。
由于我只是记录了响应,因此我在上面的代码片段中没有这样做。当我放置callback();
时,我指示该过程终止,并且任何将数据上传到S3的API请求都将永远不会完成。
这是一个有效的简化代码段:
exports.handler = function (context, event, callback) {
S3.upload(getParams(context, event), function (error, data) {
if (error) {
callback(error);
} else {
callback(null, "Data Uploaded");
}
});
};
就是这样。希望它能帮助别人。干杯! =)