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