2014-11-04 16 views
34

Muszę sprawdzić, czy plik istnieje za pomocą AWS SDK.Jak ustalić, czy obiekt istnieje AWS S3 Node.JS sdk

Oto co robię:

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

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

to działa. Problem polega na tym, że gdy obiekt nie istnieje, wywołanie zwrotne (z argumentami err i url) nie zwraca błędu, a gdy próbuję uzyskać dostęp do adresu URL, mówi "NoSuchObject".

Czy ta metoda nie powinna zwrócić obiektu powodującego błąd, gdy obiekt nie istnieje?

Jak ustalić, czy obiekt istnieje? Czy naprawdę muszę wykonać połączenie z zwróconym adresem URL?

Dzięki.

+0

Jestem pewien, że istnieje powód niezwrócenia błędu, gdy obiekt nie istnieje. To z pewnością jest ból w tyłku! –

Odpowiedz

53

Przed utworzeniem podpisanego adresu URL należy sprawdzić, czy plik istnieje bezpośrednio z zasobnika. Jednym ze sposobów, aby to zrobić, jest żądanie metadanych 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

Mam "Zakazany" kod zamiast "NotFound" – shadi

+0

Dzięki! perfect –

+1

@shadi Potrzebujesz dostępu do odczytu do obiektu ([headObject docs] (http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#headObject-property)), "Forbidden" oznacza ciebie nie mam dostępu do tego obiektu. – Marc

1

Zastosowanie getObject metoda tak:

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

To spowoduje pobranie pełnego obiektu. Lepiej wykorzystać polecenie HEAD jako wspomniane @CaptEmulation. –

0

Można również użyć metody waitFor razem ze stanem objectExists. To będzie wewnętrznie używać 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 
}); 
Powiązane problemy