2014-11-04 73 views
34

我需要使用AWS SDK检查文件是否存在。如何确定对象是否存在AWS S3 Node.JS sdk

下面是我在做什么:

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

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

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

不应该这getSignedUrl方法返回一个错误对象时,该对象不存在?

如何确定物体是否存在?我真的需要对返回的网址进行调用吗?

谢谢。

+0

我敢肯定,当对象不存在时不返回错误是有原因的。它肯定是一个痛苦的屁股! – 2015-05-19 07:18:24

回答

53

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

s3.headObject(params, function (err, metadata) { 
    if (err && err.code === 'NotFound') { 
    // Handle no object on cloud here 
    } else { 
    s3.getSignedUrl('getObject', params, callback); 
    } 
}); 
+1

我得到了一个“禁止”的代码,而不是“NotFound” – shadi 2016-05-24 15:20:11

+0

谢谢!完美 – 2016-06-28 14:34:53

+1

@shadi你需要读取对象的访问权限([headObject docs](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#headObject-property)),“Forbidden”意味着你无法访问该对象。 – Marc 2017-09-22 14:42:59

1

使用getObject方法是这样的:

var params = { 
    Bucket: config.get('s3bucket'), 
    Key: path 
}; 
s3.getObject(params, function(err, data){ 
    if(err) { 
     console.log(err); 
    }else { 
     var signedURL = s3.getSignedUrl('getObject', params, callback); 
     console.log(signedURL); 
    } 
}); 
+8

这将检索完整的对象。作为@CaptEmulation提到的最好使用HEAD请求。 – 2015-12-10 11:15:34

0

您也可以会同国家objectExists使用waitFor方法。这将在内部使用S3.headObject()

var params = { 
    Bucket: config.get('s3bucket'), 
    Key: path 
}; 
s3.waitFor('objectExists', params, function(err, data) { 
    if (err) console.log(err, err.stack); // an error occurred 
    else  console.log(data);   // successful response 
});