2014-11-04 5 views
34

Ich muss prüfen, ob die Datei mit AWS SDK existiert. HierSo ermitteln Sie, ob ein Objekt vorhanden ist AWS S3 Node.JS sdk

ist, was ich tue:

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

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

Es funktioniert. Das Problem ist, dass, wenn das Objekt nicht existiert, der Callback (mit den Argumenten err und url) keinen Fehler zurückgibt, und wenn ich versuche, auf die URL zuzugreifen, heißt es "NoSuchObject".

Sollte diese getSignedUrl-Methode ein Fehlerobjekt zurückgeben, wenn das Objekt nicht existiert?

Wie kann ich feststellen, ob das Objekt existiert? Muss ich die zurückgegebene URL wirklich anrufen?

Danke.

+0

Ich bin sicher, dass es einen Grund gibt, einen Fehler nicht zurückzugeben, wenn das Objekt nicht existiert. Es ist sicher ein Schmerz im Hintern! –

Antwort

53

Bevor Sie die signierte URL erstellen, müssen Sie überprüfen, ob die Datei direkt aus dem Bucket besteht. Eine Möglichkeit besteht darin, die HEAD-Metadaten anzufordern.

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

Ich habe einen "verbotenen" Code anstelle von "NotFound" – shadi

+0

Vielen Dank !! Perfekt –

+1

@shadi Sie benötigen Lesezugriff auf das Objekt ([headObject docs] (http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#headObject-Eigenschaft)), "Forbidden" bedeutet Sie habe keinen Zugriff auf dieses Objekt. – Marc

1

Verwenden getObject Methode wie folgt:

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

Dies wird vollständige Objekt abrufen. Es ist besser, die HEAD-Anfrage als @ CaptEmulation zu verwenden. –

0

Sie können auch die waitFor Methode zusammen mit dem objectExists Zustand verwenden. Dies wird S3.headObject() intern verwenden.

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 
});