Использование массива ключей для помещения нескольких объектов s3 в 1 массив - PullRequest
0 голосов
/ 30 апреля 2018
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 объектами, возвращенными в этом формате.

Может кто-нибудь сказать мне, как это сделать?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

вот список имен файлов, которые я пытаюсь загрузить из корзины ascendon1

вот запрос 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

output

0 голосов
/ 30 апреля 2018

Просто измените свой код на этот:

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. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...