Cómo determinar si existe un objeto AWS S3 Node.JS sdk

Necesito verificar si el archivo existe utilizando AWS SDK.

Esto es lo que estoy haciendo:

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

Funciona. El problema es que cuando el objeto no existe, la callback (con los argumentos err y url) no devuelve ningún error, y cuando bash acceder a la URL, dice “NoSuchObject”.

¿No debería este método getSignedUrl devolver un objeto de error cuando el objeto no existe?

¿Cómo puedo determinar si el objeto existe? ¿Realmente necesito hacer una llamada en el url devuelto?

Gracias.

Antes de crear la URL firmada, debe comprobar si el archivo existe directamente desde el depósito. Una forma de hacerlo es solicitando los metadatos HEAD.

 // Using callbacks s3.headObject(params, function (err, metadata) { if (err && err.code === 'NotFound') { // Handle no object on cloud here } else { s3.getSignedUrl('getObject', params, callback); } }); // Using async/await (untested) try { const headCode = await s3.headObject(params).promise(); const signedUrl = await s3.getSignedUrl('getObject', params).promise(); // Do something with signedUrl } catch (headErr) { if (headErr.code === 'NotFound') { // Handle no object on cloud here } } 

Utilice el método getObject como este:

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

También puede utilizar el método waitFor junto con los objectExists estado. Esto utilizará S3.headObject() internamente.

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