2014-11-04 16 views
34

Tôi cần kiểm tra xem tệp có tồn tại bằng AWS SDK hay không.Cách xác định xem đối tượng có tồn tại AWS S3 Node.JS sdk

Đây là những gì tôi đang làm:

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

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

Nó hoạt động. Vấn đề là khi đối tượng không tồn tại, các cuộc gọi lại (với đối số err và url) trả về không có lỗi, và khi tôi cố gắng truy cập vào URL, nó nói "NoSuchObject".

Không nên phương pháp getSignedUrl trả về một đối tượng lỗi khi đối tượng không tồn tại?

Làm cách nào để xác định xem đối tượng có tồn tại không? Tôi có thực sự cần thực hiện cuộc gọi trên url được trả về không?

Cảm ơn.

+0

Tôi chắc chắn có lý do không trả lại lỗi khi đối tượng không tồn tại. Nó chắc chắn là một cơn đau ở mông! –

Trả lời

53

Trước khi tạo URL đã ký, bạn cần kiểm tra xem tệp có tồn tại trực tiếp từ nhóm hay không. Một cách để làm điều đó là bằng cách yêu cầu siêu dữ liệu 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

Tôi nhận được mã "Bị cấm" thay vì "NotFound" – shadi

+0

Cảm ơn !! hoàn hảo –

+1

@shadi Bạn cần quyền truy cập đọc vào đối tượng ([tài liệu headObject] (http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#headObject-property)), "Bị cấm" có nghĩa là bạn không có quyền truy cập vào đối tượng đó. – Marc

1

Sử dụng phương pháp getObject như thế này:

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

Điều này sẽ truy lục đối tượng đầy đủ. Tốt hơn nên sử dụng yêu cầu HEAD như @CaptEmulation được đề cập. –

0

Bạn cũng có thể sử dụng phương pháp waitFor cùng với tình trạng objectExists. Điều này sẽ sử dụng S3.headObject() nội bộ.

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 
}); 
Các vấn đề liên quan