如何确定对象是否存在 AWS S3 Node.JS sdk

新手上路,请多包涵

我需要使用 AWS 开发工具包检查文件是否存在。这是我正在做的事情:

 var params = {
    Bucket: config.get('s3bucket'),
    Key: path
};

s3.getSignedUrl('getObject', params, callback);

它可以工作,但问题是当对象不存在时,回调(带有参数 err 和 url)不会返回错误,当我尝试访问 URL 时,它会显示“NoSuchObject”。

当对象不存在时,这 getSignedUrl 方法不应该返回错误对象吗?如何确定对象是否存在?我真的需要对返回的 URL 进行调用吗?

原文由 Maurício Giordano 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 780
2 个回答

在创建签名 URL 之前,您需要检查文件是否直接从存储桶中存在。一种方法是请求 HEAD 元数据。

 // Using callbacks
s3.headObject(params, function (err, metadata) {
  if (err && err.name === 'NotFound') {
    // Handle no object on cloud here
  } else if (err) {
    // Handle other errors here....
  } else {
    s3.getSignedUrl('getObject', params, callback);
    // Do stuff with signedUrl
  }
});

// Using async/await
try {
  await s3.headObject(params).promise();
  const signedUrl = s3.getSignedUrl('getObject', params);
  // Do stuff with signedUrl
} catch (error) {
  if (error.name === 'NotFound') { // Note with v3 AWS-SDK use error.code
    // Handle no object on cloud here...
  } else {
    // Handle other errors here....
  }
}

原文由 CaptEmulation 发布,翻译遵循 CC BY-SA 4.0 许可协议

没有 try/catch 块的最简单的解决方案。

 const exists = await s3
  .headObject({
    Bucket: S3_BUCKET_NAME,
    Key: s3Key,
  })
  .promise()
  .then(
    () => true,
    err => {
      if (err.code === 'NotFound') {
        return false;
      }
      throw err;
    }
  );

原文由 sky 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题