nodejs node listobjects for deleteobjects aws javascript node.js amazon-s3

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(...);