2014-11-04 3 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 возвращать объект ошибки, когда объект не существует?

Как определить, существует ли объект? Мне действительно нужно позвонить по возвращенному URL-адресу?

Спасибо.

+0

Уверен, что есть причина не возвращать ошибку, когда объект не существует. Это, конечно, боль в заднице! –

ответ

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

+0

Спасибо! perfect –

+1

@shadi Вам нужен доступ для чтения к объекту ([headObject docs] (http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#headObject-property)), «Запрещено» означает, что вы не имеют доступа к этому объекту. – Marc

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

Это позволит получить полный объект. Лучше использовать HEAD-запрос, упомянутый как @CaptEmulation. –

0

Вы также можете использовать метод waitFor вместе с государством objectExists. Это будет использовать внутреннее устройство 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 
}); 
Смежные вопросы