如何使用node.js api同步上传文件到s3

时间:2016-01-17 15:18:27

标签: node.js amazon-s3 aws-sdk

我有以下代码:

array.forEach(function (item) {

       // *** some processing on each item ***

        var params = {Key: item.id, Body: item.body};
        s3bucket.upload(params, function(err, data) {
            if (err) {
              console.log("Error uploading data. ", err);
            } else {
              console.log("Success uploading data");
        }});
  });

因为s3bucket.upload是异步执行的 - 循环在上传所有项目之前完成。

如何强制s3bucket.upload同步?

意味着不要跳转到下一次迭代,直到此项目上传(或失败)为S3。

由于

3 个答案:

答案 0 :(得分:2)

您可以使用https://github.com/caolan/async#each eacheachSeries

function upload(array, next) {
    async.eachSeries(array, function(item, cb) {
        var params = {Key: item.id, Body: item.body};
        s3bucket.upload(params, function(err, data) {
            if (err) {
              console.log("Error uploading data. ", err);
              cb(err)
            } else {
              console.log("Success uploading data");
              cb()
            }
        })
    }, function(err) {
        if (err) console.log('one of the uploads failed')
        else console.log('all files uploaded')
        next(err)
    })
}

答案 1 :(得分:2)

您可以传递回发功能,这样只有在上传完成后才能执行其余代码。这不能回答你的问题,但可能是另一种选择。

array.forEach(function (item) {

   // *** some processing on each item ***

    var params = {Key: item.id, Body: item.body};
    var f1=function(){
       // stuff to do when upload is ok!
     }
      var f2=function(){
       // stuff to do when upload fails
     }
    s3bucket.upload(params, function(err, data) {

        if (err) {
         f2();
          console.log("Error uploading data. ", err);
         // run my function

        } else {
       // run my function
          f1();
          console.log("Success uploading data");
    }});

});

答案 2 :(得分:2)

更好地使用其中一项评论中所建议的承诺:

const uploadToS3 = async (items) => {
  for (const item of array) {
    const params = { Key: item.id, Body: item.body };
    try {
      const data = await s3bucket.upload(params).promise();
      console.log("Success uploading data");
    } catch (err) {
      console.log("Error uploading data. ", err);
    }
  }
}