【问题标题】:Using an array of keys to push multiple s3 objects into 1 array使用键数组将多个 s3 对象推入 1 个数组
【发布时间】:2018-10-10 16:04:44
【问题描述】:
const AWS = require("aws-sdk");
const s3 = new AWS.S3();

function getAttachments(file, bucket) {
    var paramsArray = [];
    var attachmentArray = [];
    for (var a = 0; a < file.length; a++) {
        paramsArray.push({
            Bucket: bucket,
            Key: file[a]
        });
    }
    paramsArray.map(x = > s3.getObject(x, function (err, data) {
        if (err) {
            console.log(err);
        }
        attachmentArray.push({
            filename: x.Key,
            content: data.Body
        });
        console.log(attachmentArray)
    })
)
}

var attachments = ['a.doc', 'b.doc', 'c.doc', 'd.doc', 'e.doc']

getAttachments(attachments, 
'exampleBucket')

我想记录一个对象数组,每个对象的键作为文件名,缓冲区字符串作为内容。但是,在此示例中,我记录了附件数组中每个元素的大小增加的多个数组。

这些格式正确,例如:[{filename: a.doc, content: 'Buffer String'}],但我只想要一个数组,其中包含以该格式返回的 5 个对象。

谁能告诉我怎么做?

【问题讨论】:

  • 你能举例说明你现在得到了什么吗?
  • 你的代码很乱……你为什么要创建变量attachmentsToSend?这是不必要的。
  • 是这样的 = [{filename: 'a.doc', bufferString}], [{filename: a.doc, content: bufferString}, {filename: 'b.doc', content: bufferString}], [{filename: a.doc, content: bufferString}, {filename: 'b.doc', content: bufferString}, {filename: 'c.doc', content: bufferString}] 等等.
  • 对不起,我很快就从别的东西上改编了它,所以我可以在这里问这个问题,我还没有这么有经验。

标签: javascript arrays node.js loops amazon-s3


【解决方案1】:

这是我尝试从 assson1 存储桶下载的文件名列表

这里是 AJAX 请求

var data = {fileNames: ['1.txt','2.txt']};
      $.ajax({
                    type: "POST",
                    url: 'downloadFiles',
                    data: JSON.stringify(data),
                    processData: false,
                    dataType: "json",
                    contentType: 'application/json',
                    success:function(data){
                        alert(data);
                    }
                });

这是 NodeJS 代码

 app.post('/downloadFiles',function(req,res){

        var promises =[];
        var filesContent = [];
        var filesToDownload = req.body.fileNames
        for(var z=0; z<req.body.fileNames.length;z++){
            var fileName = filesToDownload[z];
            promises.push(getAttachment(fileName));
        }

        Promise.all(promises).then(function(data){
            for(var z=0; z<req.body.fileNames.length;z++){
                var contents={
                    filename: filesToDownload[z],
                    content: data[z].Body
                };
                filesContent.push(contents);
            }
            console.log(filesContent);

        }).catch(function(error){
            console.log(error.stack);
        })

    })

    function getAttachment(fileName){
        var params ={
            Bucket: "ascendon1", 
            Key: fileName
        }
        return s3.getObject(params).promise();
    }

这是最终输出,我们在单个数组中获得了我们请求的所有内容,即 filesContent

【讨论】:

  • 这也完全可行,根本不需要修改它,谢谢!我真的应该使用承诺,会更多地研究它们!
【解决方案2】:

只需将您的代码更改为以下代码:

const AWS = require("aws-sdk");
const s3 = new AWS.S3();
const attachments = ['a.doc', 'b.doc', 'c.doc', 'd.doc', 'e.doc']

getAttachments(attachments, bucket)
  .then(console.log)
  .catch(console.error);

function getAttachments(files, bucket) {
  return files.map(filename => getAttachment(filename, bucket));
}

function getAttachment(filename, bucket){
  return new Promise((resolve,reject) => {
    const params = {
            Bucket: bucket,
            Key: filename
        };
    s3.getObject(params, (error, data) => {
      if(error) return reject(error);
      return resolve({
        filename: filename,
        content: data.Body
      });
    });
  });
}

或者您可以完全删除getAttachments 函数。 希望对您有所帮助。

【讨论】:

  • 谢谢你,这真的很有帮助。我应该一开始就使用承诺,但需要更多地阅读它们!不得不稍微修改它,但几乎可以正常工作,谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-10-19
  • 2021-02-09
  • 2019-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
相关资源
最近更新 更多