AWS Lambda - 如果 S3 中存在对象,则无法执行操作

Amb*_*ous 2 javascript amazon-s3 amazon-web-services node.js aws-lambda

我正在 NodeJs 中编写一个 lambda 函数,我想检查 S3 中是否存在文件。如果文件存在,我返回“A”,否则返回“B”。我正在使用 S3.HeadObject 来获取对象元数据作为承诺。

exports.handler = async (event, context, callback) => {
var params = {
    Bucket: "BucketName", 
    Key: "ObjectName"
};

const response = s3.headObject(params).promise();
Run Code Online (Sandbox Code Playgroud)

我能够得到响应,但无法检查文件是否存在。我首先尝试了 if/else 子句

 response.then(function(result) {
  const type = result['ContentType'];
  if(type == 'image/jpeg') {
      return "URL1"
  } else {
      return "URL2"
  }
}); 
Run Code Online (Sandbox Code Playgroud)

但是,我从未返回 URL1 或 URL2,lambda 返回 null。浏览了其他一些 SO 帖子,我发现了另一种方法:

s3.headObject(params, function(err, data) {
 if (err) {
  console.log(err, err.stack);
  return;
 }
 console.log(data)
});
Run Code Online (Sandbox Code Playgroud)

但是,这样我根本得不到任何回应。记录器不打印任何内容。

有人可以告诉我我做错了什么吗?我想根据 S3 中文件的可用性返回特定 URL。如果存在 JPG,则返回 JPG url。否则返回 PNG url。

谢谢!

Ers*_*soy 5

我用存在/不存在的情况测试了以下一个,根据存在情况打印真/假。自从你提到以来,我没有尝试获取内容或其他元数据(只是可用性)

我想根据 S3 中文件的可用性返回特定 URL

let AWS = require('aws-sdk');
let S3 = new AWS.S3();

exports.handler = async(event, context, callback) => {
    let exist = await get();
    console.log(exist);
    // your exist checks
};

async function get() {
    let exist = true;
    let params = {
        Bucket: "your-bucket-name",
        Key: 'your-key'
    };

    try {
        await S3.headObject(params).promise();
    } catch (err) {
        exist = false;
    }

    return exist;
}
Run Code Online (Sandbox Code Playgroud)