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

14 浏览
0 Comments

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

我需要使用AWS SDK来检查文件是否存在。以下是我的做法:\n

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

\n它可以工作,但问题是当对象不存在时,回调函数(带有err和url参数)不返回错误,而且当我尝试访问URL时,会显示\"NoSuchObject\"。\n当对象不存在时,这个getSignedUrl方法不应该返回一个错误对象吗?我该如何确定对象是否存在?我真的需要对返回的URL进行调用吗?

0
0 Comments

如何使用AWS S3 Node.JS SDK确定对象是否存在

在使用AWS S3 Node.JS SDK时,我们可以通过使用`headObject`方法来确定对象是否存在。下面是一个示例代码:

AWS.config.update({
    accessKeyId: "*****",
    secretAccessKey: "****",
    region: region,
    version: "****"
});
const s3 = new AWS.S3();
const params = {
    Bucket: s3BucketName,
    Key: "filename" // 如果有子文件夹 -> path/of/the/folder.ext
}
try {
    await s3.headObject(params).promise()
    console.log("File Found in S3")
} catch (err) {
    console.log("File not Found ERROR: " + err.code)
}

在上述代码中,我们使用了`headObject`方法来检查对象是否存在。如果文件不存在,它将抛出`NotFound: null`的错误。

如果您想在存储桶中执行任何操作,您需要更改AWS中相应存储桶的`CORS Configuration`权限。为了更改权限,您可以转到`Bucket -> permission -> CORS Configuration`,并添加以下代码:


    
        *
        PUT
        POST
        DELETE
        GET
        HEAD
        *
    

如果想了解更多关于CORS Configuration的信息,可以参考以下链接:https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html

0
0 Comments

如何确定AWS S3 Node.JS SDK中的对象是否存在

以下是一种在不使用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;
    }
  );

在AWS S3中,判断对象是否存在是一个常见的需求。通过使用AWS S3 Node.JS SDK,我们可以使用`headObject`方法来检查对象是否存在。上述代码展示了如何使用该方法来判断对象是否存在。

首先,我们使用`s3.headObject`方法来发送一个请求,该请求包含要检查的对象的桶(Bucket)和键(Key)。这个方法返回一个Promise对象。

接下来,我们通过调用`.promise()`方法,将返回的Promise对象转换为一个可等待的Promise。

然后,我们使用`.then()`方法来处理Promise的解决和拒绝状态。如果Promise被解决(即对象存在),我们返回`true`。如果Promise被拒绝,并且错误的代码是`NotFound`,我们返回`false`。如果错误的代码不是`NotFound`,我们将错误抛出。

最后,我们将上述代码封装在一个名为`exists`的变量中。

通过这种方法,我们可以在不使用try/catch块的情况下确定对象是否存在。这种方式简洁且易于理解,可以提高代码的可读性和可维护性。

0
0 Comments

如何确定AWS S3 Node.JS SDK中的对象是否存在

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

// 使用回调函数
s3.headObject(params, function (err, metadata) {  
  if (err && err.name === 'NotFound') {  
    // 处理云上没有对象的情况  
  } else if (err) {
    // 处理其他错误...
  } else {  
    s3.getSignedUrl('getObject', params, callback);  
    // 处理签名URL
  }
});
// 使用async/await
try {
  await s3.headObject(params).promise();
  const signedUrl = s3.getSignedUrl('getObject', params);
  // 处理签名URL
} catch (error) {
  if (error.name === 'NotFound') {
    // 处理云上没有对象的情况...
  } else {
    // 处理其他错误...
  }
}

您需要对对象具有读取权限(headObject文档),"Forbidden"表示您无法访问该对象。

我认为我以前有完全访问权限,但我不确定。那是很久以前的事了。

我不这样认为...你可能可以访问文件,但无法访问文件夹。

这已经是老新闻了,但是"Forbidden"明确表示您没有适当的"读取"权限。

对于其他人来说,这是一个访问问题,但是需要什么访问权限并不明显-实际上需要的是ListBucket。docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectHEAD.htm

如何实现该代码的async/await版本?

已添加async/await版本。完全没有经过测试。使用时自负风险。

在Async Await版本中,getSignedUrl...显然不需要.promise()。另一个奇怪的事情是,如果我只执行s3.getSignedUrl('getObject', params),它不会返回完整的URL...似乎需要调用headObject才能获取完整的签名URL...是吗?

您是正确的,.promise不是必需的,答案已经被编辑过。您可以获取任何东西的签名URL,即使它不存在。headObject检查是为了确定对象是否存在-根据文档,ListBucket权限不是必需的。然而,如果具有ListBucket权限,那么在对象不存在的情况下,响应将从403(没有ListBucket权限)更改为404(有ListBucket权限)。

0