react nodejs node listobjects files deleteobjects aws node.js amazon-web-services amazon-s3

node.js - listobjects - nodejs s3 upload



Cómo determinar si el objeto existe AWS S3 Node.JS sdk (8)

Necesito verificar si existe un archivo usando AWS SDK. Esto es lo que estoy haciendo:

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

Funciona, pero el problema es que cuando el objeto no existe, la devolución de llamada (con argumentos err y url) no devuelve ningún error, y cuando intento 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 determino si el objeto existe? ¿Realmente necesito hacer una llamada en la URL devuelta?


Llamada sincrónica en S3 en Nodejs en lugar de llamada asincrónica usando Promise

var request = require("request"); var AWS = require("aws-sdk"); AWS.config.update({ accessKeyId: "*****", secretAccessKey: "********" }); const s3 = new AWS.S3(); var response; function initialize(bucket,key) { // Setting URL and headers for request const params = { Bucket: bucket, Key: key }; // Return new promise return new Promise(function(resolve, reject) { s3.headObject(params, function(err, resp, body) { if (err) { console.log(''Not Found : '' + params.Key ); reject(params.Key); } else { console.log(''Found : '' + params.Key ); resolve(params.Key); } }) }) } function main() { var foundArray = new Array(); var notFoundArray = new Array(); for(var i=0;i<10;i++) { var key = ''1234''+ i; var initializePromise = initialize(''****'',key); initializePromise.then(function(result) { console.log(''Passed for : '' + result); foundArray.push(result); console.log (" Found Array : "+ foundArray); }, function(err) { console.log(''Failed for : '' + err); notFoundArray.push(err); console.log (" Not Found Array : "+ notFoundArray); }); } } main();


Operación Put Sincrónica

var request = require("request"); var AWS = require("aws-sdk"); AWS.config.update({ accessKeyId: "*****", secretAccessKey: "***" }); const s3 = new AWS.S3(); var response; function initialize(bucket,key) { // Setting URL and headers for request const params = { Bucket: bucket, Key: key }; // Return new promise return new Promise(function(resolve, reject) { s3.putObject(params, function(err, resp, body) { if (err) { reject(); } else { resolve(); } }) }) } function main() { var promiseArray = []; var prefix = ''abc/test/''; for(var i=0;i<10;i++) { var key = prefix +''1234''+ i; promiseArray[i] = initialize(''bucket'',key); promiseArray[i].then(function(result) { console.log (" Successful "); }, function(err) { console.log (" Error "); }); } console.log(''Promises '' + promiseArray); Promise.all(promiseArray).then(function(values) { console.log("******TESTING****"); }); } main();


Promesa. Todo sin falla Operación Sincrónica

var request = require("request"); var AWS = require("aws-sdk"); AWS.config.update({ accessKeyId: "*******", secretAccessKey: "***********" }); const s3 = new AWS.S3(); var response; function initialize(bucket,key) { // Setting URL and headers for request const params = { Bucket: bucket, Key: key }; // Return new promise return new Promise(function(resolve, reject) { s3.headObject(params, function(err, resp, body) { if (err) { resolve(key+"/notfound"); } else{ resolve(key+"/found"); } }) }) } function main() { var foundArray = new Array(); var notFoundArray = new Array(); var prefix = ''abc/test/''; var promiseArray = []; try{ for(var i=0;i<10;i++) { var key = prefix +''1234'' + i; console.log("Key : "+ key); promiseArray[i] = initialize(''bucket'',key); promiseArray[i].then(function(result) { console.log("Result : " + result); var temp = result.split("/"); console.log("Temp :"+ temp); if (temp[3] === "notfound") { console.log("NOT FOUND"); }else{ console.log("FOUND"); } }, function(err) { console.log (" Error "); }); } Promise.all(promiseArray).then(function(values) { console.log("^^^^^^^^^^^^TESTING****"); }).catch(function(error) { console.error(" Errro : "+ error); }); }catch(err){ console.log(err); } } main();


Antes de crear la URL firmada, debe verificar 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 } }


La solución más simple sin el bloque try / catch.

const exists = await s3 .headObject({ Bucket: S3_BUCKET_NAME, Key: s3Key, }) .promise() .then( () => true, err => { if (err.code === ''NotFound'') { return false; } throw err; } );


También puede usar el método waitFor junto con el estado objectExists . Esto usará 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 });


Utilice el método getObject esta manera:

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


mediante el uso del método headObject

AWS.config.update({ accessKeyId: "*****", secretAccessKey: "****", region: region, version: "****" }); const s3 = new AWS.S3(); const params = { Bucket: s3BucketName, Key: "filename" //if any sub folder-> path/of/the/folder.ext } try { await s3.headObject(params).promise() console.log("File Found in S3") } catch (err) { console.log("File not Found ERROR : " + err.code) }

Como los params son constantes, la mejor manera de usarlo con const . Si el archivo no se encuentra en el s3, arroja el error NotFound : null .

Si desea aplicar cualquier operación en el depósito, debe cambiar los permisos de CORS Configuration de CORS Configuration en el depósito respectivo en el AWS. Para cambiar los permisos Bucket->permission->CORS Configuration y Agregar este código.

<CORSConfiguration> <CORSRule> <AllowedOrigin>*</AllowedOrigin> <AllowedMethod>PUT</AllowedMethod> <AllowedMethod>POST</AllowedMethod> <AllowedMethod>DELETE</AllowedMethod> <AllowedMethod>GET</AllowedMethod> <AllowedMethod>HEAD</AllowedMethod> <AllowedHeader>*</AllowedHeader> </CORSRule> </CORSConfiguration>

Para obtener más información sobre la configuración de CORS: https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html