javascript - node - deleteobjects s3
¿Cómo obtener respuesta de S3 getObject en Node.js? (4)
A primera vista, no parece que esté haciendo nada mal, pero no muestra todo su código. Lo siguiente funcionó para mí cuando estaba revisando S3 y Node por primera vez:
var AWS = require(''aws-sdk'');
if (typeof process.env.API_KEY == ''undefined'') {
var config = require(''./config.json'');
for (var key in config) {
if (config.hasOwnProperty(key)) process.env[key] = config[key];
}
}
var s3 = new AWS.S3({accessKeyId: process.env.AWS_ID, secretAccessKey:process.env.AWS_KEY});
var objectPath = process.env.AWS_S3_FOLDER +''/test.xml'';
s3.putObject({
Bucket: process.env.AWS_S3_BUCKET,
Key: objectPath,
Body: "<rss><data>hello Fred</data></rss>",
ACL:''public-read''
}, function(err, data){
if (err) console.log(err, err.stack); // an error occurred
else {
console.log(data); // successful response
s3.getObject({
Bucket: process.env.AWS_S3_BUCKET,
Key: objectPath
}, function(err, data){
console.log(data.Body.toString());
});
}
});
En un proyecto Node.js estoy intentando recuperar datos de S3.
Cuando uso
getSignedURL
, todo funciona:
aws.getSignedUrl(''getObject'', params, function(err, url){
console.log(url);
});
Mis params son:
var params = {
Bucket: "test-aws-imagery",
Key: "TILES/Level4/A3_B3_C2/A5_B67_C59_Tiles.par"
Si llevo la salida de URL a la consola y la pego en un navegador web, descarga el archivo que necesito.
Sin embargo, si trato de usar
getObject
, obtengo todo tipo de comportamientos extraños.
Creo que lo estoy usando incorrectamente.
Esto es lo que he intentado:
aws.getObject(params, function(err, data){
console.log(data);
console.log(err);
});
Salidas:
{
AcceptRanges: ''bytes'',
LastModified: ''Wed, 06 Apr 2016 20:04:02 GMT'',
ContentLength: ''1602862'',
ETag: ''9826l1e5725fbd52l88ge3f5v0c123a4"'',
ContentType: ''application/octet-stream'',
Metadata: {},
Body: <Buffer 01 00 00 00 ... > }
null
Entonces parece que esto está funcionando correctamente.
Sin embargo, cuando pongo un punto de interrupción en uno de los
console.log
s, mi IDE (NetBeans) arroja un error y se niega a mostrar el valor de los datos.
Si bien esto podría ser el IDE, decidí probar otras formas de usar
getObject
.
aws.getObject(params).on(''httpData'', function(chunk){
console.log(chunk);
}).on(''httpDone'', function(data){
console.log(data);
});
Esto no genera nada.
Poner un punto de interrupción en muestra que el código nunca llega a ninguno de los
console.log
s.
También probé:
aws.getObject(params).on(''success'', function(data){
console.log(data);
});
Sin embargo, esto tampoco genera nada y colocar un punto de interrupción muestra que nunca se alcanza el
console.log
.
¿Qué estoy haciendo mal?
Al hacer un
getObject()
desde la API S3, según los
docs
el contenido de su archivo se encuentra en la propiedad
Body
, que puede ver en su salida de muestra.
Deberías tener un código que se parezca a lo siguiente
const aws = require(''aws-sdk'');
const s3 = new aws.S3(); // Pass in opts to S3 if necessary
var getParams = {
Bucket: ''abc'', // your bucket name,
Key: ''abc.txt'' // path to the object you''re looking for
}
s3.getObject(getParams, function(err, data) {
// Handle any error and exit
if (err)
return err;
// No error happened
// Convert Body from a Buffer to a String
let objectData = data.Body.toString(''utf-8''); // Use the encoding necessary
});
Es posible que no necesite crear un nuevo búfer a partir de los
data.Body
Objeto del
data.Body
pero si lo necesita, puede usar la muestra anterior para lograrlo.
Alternativamente, puede usar la biblioteca cliente minio-js get-object.js
var Minio = require(''minio'')
var s3Client = new Minio({
endPoint: ''s3.amazonaws.com'',
accessKey: ''YOUR-ACCESSKEYID'',
secretKey: ''YOUR-SECRETACCESSKEY''
})
var size = 0
// Get a full object.
s3Client.getObject(''my-bucketname'', ''my-objectname'', function(e, dataStream) {
if (e) {
return console.log(e)
}
dataStream.on(''data'', function(chunk) {
size += chunk.length
})
dataStream.on(''end'', function() {
console.log("End. Total size = " + size)
})
dataStream.on(''error'', function(e) {
console.log(e)
})
})
Descargo de responsabilidad: trabajo para Minio Su fuente abierta, almacenamiento de objetos compatible con S3 escrito en golang con bibliotecas cliente disponibles en Java , Python , Js , golang .
Basado en la respuesta de @peteb, pero usando
Promises
y
Async/Await
:
const AWS = require(''aws-sdk'');
const s3 = new AWS.S3();
async function getObject (bucket, objectKey) {
try {
const params = {
Bucket: bucket,
Key: objectKey
}
const data = await s3.getObject(params).promise();
return data.Body.toString(''utf-8'');
} catch (e) {
throw new Error(`Could not retrieve file from S3: ${e.message}`)
}
}
// To retrieve you need to use `await getObject()` or `getObject().then()`
getObject(''my-bucket'', ''path/to/the/object.txt'').then(...);