NodeJS AWS Lambda ListObject返回空数组

时间:2017-03-12 19:35:58

标签: node.js amazon-web-services amazon-s3 aws-lambda

我是AWS新手。我正在使用NodeJS创建一个Scheduled lambda函数。在那里,我需要获取文件夹中的所有对象并遍历每个对象,以检查上次修改日期,并且我想删除旧对象。但我在ListObject的响应内容中得到空数组。

var s3 = new aws.S3();
exports.handler = (event, context, callback) => {

var params = {
    Bucket: 'bucket_name',
    Delimiter: '/',
    Prefix: 'folder_name',
    MaxKeys:100000
};
s3.listObjects(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else
  {     
    var folderLength = data.Contents.length;
    data.Contents.forEach(function(metadata) {
      console.log('Key: ' + metadata.Key);
    });

  }
});
callback(null, 'Finished');
};

但在回复中我得到Contents: []。谁能告诉我什么是错的?

1 个答案:

答案 0 :(得分:1)

当您使用Delimiter: '/'致电ListObjects()时,data内有两个感兴趣的数组:ContentsCommonPrefixes

Contents是以您指定的Prefix值开头的对象列表,但不包括下一个DelimiterCommonPrefixes是常用前缀的列表对所有前缀为Prefix的对象,包括下一次出现的Delimiter(按惯例为/)。

S3实际上没有文件夹 - 只是共享公共前缀的对象,用/分隔。

在S3控制台中创建文件夹foo时,实际创建了一个键为foo/的空对象。但是,如果使用API​​上传带有键foo/bar.html的对象,则为了方便起见,控制台仍会在名为bar.html的文件夹中将其显示为文件foo,即使在后一种情况下,没有显式创建foo/个对象。值得注意的是,在任何情况下,对象实际上都不是"在"一个有意义的"文件夹"容器。它只是以这种方式呈现的。 S3没有实际的文件夹 - 只有对象和存储桶。

如果你想要一个文件夹中的所有对象""你真正要说的是你希望这些对象共享一个共同的密钥前缀。

但是当S3提供共享公共密钥前缀" folder_name"的所有对象的列表时直到下一个/ (如上所述),然后就没有了。

在原始代码中,Contents为空,但您会发现响应中的data.CommonPrefixes包含单个值folder_name/,因为所有以键开头的对象folder_name 直到下一个/ 实际上共享公共前缀folder_name/

在提出两个请求时没有意义,第一个请求是冗余且不必要的(事实上,如果多个文件夹的名称​​以开头,那么这样做会给你不正确的结果" folder_name")所以当你想要一个对象列表"在一个文件夹中,"正确的方法是将Prefix设置为folder_name + '/'