Node.js NodeJS AWS Lambda ListObject返回空数组

Node.js NodeJS AWS Lambda ListObject返回空数组,node.js,amazon-web-services,amazon-s3,aws-lambda,Node.js,Amazon Web Services,Amazon S3,Aws Lambda,我是AWS的新手。我正在使用NodeJS创建一个调度lambda函数。在那里,我需要获取文件夹中的所有对象,并对每个对象进行迭代,以检查上次修改的日期,并删除旧对象。但我在ListObject的响应内容中得到了空数组 但在回复中,我得到的内容是:[]。谁能告诉我出了什么问题吗?当您使用分隔符“/”调用时,数据中有两个有趣的数组:Contents和CommonPrefixes Contents是以您指定的前缀值开始的对象列表,该前缀值一直到但不包括下一个分隔符,CommonPrefixes是前缀为

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

但在回复中,我得到的内容是:[]。谁能告诉我出了什么问题吗?

当您使用分隔符“/”调用时,数据中有两个有趣的数组:Contents和CommonPrefixes

Contents是以您指定的前缀值开始的对象列表,该前缀值一直到但不包括下一个分隔符,CommonPrefixes是前缀为Prefix的所有对象的通用前缀列表,直到并包括根据约定出现的下一个分隔符

S3实际上没有文件夹——只有共享公共前缀的对象,以/分隔

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

如果您希望文件夹中的所有对象,您真正想说的是希望对象共享一个公共密钥前缀

但是,如果S3提供了一个列表,其中列出了在上一个/之前共享公共密钥前缀文件夹\u名称的所有对象,那么就没有任何对象了

在原始代码中,内容为空,但您会发现响应中的data.CommonPrefixes包含一个值folder_name/,因为其键从folder_name开始到下一个/实际上共享公共前缀folder_name/


提出两个请求没有任何意义,第一个请求是多余和不必要的,事实上,如果多个文件夹的名称以folder_name开头,那么这样做会产生错误的结果。因此,当您需要文件夹中的对象列表时,正确的方法是将前缀设置为folder_name+“/”。

是否在同一区域上运行lambda和s3?是否确实获得了空数组?在我看来,你似乎是在任何结果出来之前终止lambda。回调函数调用应该使用listObject结果函数。S3中的伪文件夹应该有一个隐藏的尾随斜杠。请验证在文件夹名称中添加尾随斜杠是否可以解决您的问题,我将在回答中提供更多解释。试试前缀:“folder_name/”,这是一个很好的观点,@jens.thanking@Michael sqlbot前缀:“folder_name/”就是问题所在。如果你把它作为答案贴出来,我可以接受
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');
};