如何从Twilio函数将数据加载到S3存储桶中?

时间:2020-02-16 03:08:30

标签: javascript amazon-s3 twilio

我编写了以下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)}`);
    });
}

1 个答案:

答案 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");
        }
    });
};

就是这样。希望它能帮助别人。干杯! =)