2014-11-04 99 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 
});