listObjectsV2 для перечисления всех объектов из вложенных «папок» с помощью nodejs

#node.js #amazon-web-services #amazon-s3

Вопрос:

Я хочу выполнить простую задачу: перечислить все объекты внутри определенной «папки» в s3. У меня есть такая структура папок в s3″

  s3Bucket/folder1/folder2/some-txt-file.txt.
 

В моем случае мне нужно перечислить все в папке 2. Я хочу, чтобы узел выдал мне этот вывод

 ['some-txt-file.txt']
 

Я пишу функцию для этого.
Я использую цикл for, потому что у меня несколько файлов в папке 2, поэтому на выходе действительно должен быть список имен текстовых файлов.
Код выглядит так

 const AWS = require('aws-sdk');
const s3Bucket = process.env.S3_BUCKET;
AWS.config.loadFromPath('./config_test.json');
const s3 = new AWS.S3();



async function list_everything_in_folder2(f1,f2){
    var params = {
        Bucket:s3Bucket,
        Delimiter:'/',
        Prefix:f1 '/' f2 '/'
    }
    const objs = await s3.listObjectsV2(params).promise();
    var out=[];
    for(obj of objs.CommonPrefixes){
        out.push(obj.Prefix);
    }

    return out
}
 

В результате получается пустой список.

Интересно, однако, когда я игнорирую второй аргумент функции и помещаю свой префикс в параметры, подобные этому

 var params = {
  Bucket: 'top-bucket',
  Delimiter: '/',
  Prefix: f1  '/'
}
 

выход становится

 ['top-bucket/folder1/']
 

Кажется, я не могу просмотреть больше вложенных папок, он перестает работать после «первого появления разделителя», так сказать. Есть какие-нибудь идеи? Я искал ответы здесь и в других местах, но, судя по ним, я не делаю ничего плохого? Кстати, я совсем новичок в nodejs, так что объясни мне это, как будто мне 5 лет.
Спасибо

Ответ №1:

CommonPrefixes содержит список повторяющихся префиксов в объектах между указанным разделителем. Другими словами, это список «подкаталогов» для текущего списка.

Список объектов находится внутри Contents , поэтому измените цикл for на этот:

     for(obj of objs.Contents){
        out.push(obj.Key);
    }
 

Это выведет объекты под этим префиксом, не считая объектов на уровень глубже. Если вы хотите получить полный рекурсивный список, начинающийся с указанного вами префикса, удалите Delimiter:'/', его из своего params .

Комментарии:

1. Да, я обнаружил это и в то же время, CommonPrefixes случайно оказались в этой функции из какого-то другого кода, который я писал, и я совершенно не осознавал тот факт, что я обращаюсь не к тому свойству. Спасибо, решено!