如何确定对象是否存在AWS S3 Node.JS SDK
如何确定对象是否存在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进行调用吗?
如何使用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
如何确定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块的情况下确定对象是否存在。这种方式简洁且易于理解,可以提高代码的可读性和可维护性。
如何确定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权限)。