99 votes

Comment obtenir une réponse de S3 getObject dans Node.js?

Dans un Node.js projet je cherche à récupérer des données à partir de S3.

Lorsque j'utilise getSignedURL, tout fonctionne:

aws.getSignedUrl('getObject', params, function(err, url){
    console.log(url); 
}); 

Mes paramètres sont les suivants:

var params = {
              Bucket: "test-aws-imagery", 
              Key: "TILES/Level4/A3_B3_C2/A5_B67_C59_Tiles.par"

Si je prends l'URL de la sortie de la console et de le coller dans un navigateur web, il télécharge le fichier dont j'ai besoin.

Cependant, si j'essaie d'utiliser getObject je reçois toutes sortes de comportement étrange. Je crois que je suis juste en utilisant de façon incorrecte. C'est ce que j'ai essayé:

aws.getObject(params, function(err, data){
    console.log(data); 
    console.log(err); 
}); 

Sorties:

{ 
  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

Il semble donc que cela fonctionne correctement. Cependant, quand je mets un point d'arrêt sur l'une des console.logs, mon IDE (NetBeans) renvoie une erreur et refuse de montrer la valeur de données. Bien que ce pourrait être simplement l'IDE, j'ai décidé d'essayer d'autres façons de les utiliser, getObject.

aws.getObject(params).on('httpData', function(chunk){
    console.log(chunk); 
}).on('httpDone', function(data){
    console.log(data); 
});

Cela ne veut pas afficher quoi que ce soit. Mettant un point d'arrêt dans les spectacles que le code n'atteint jamais une de la console.logs. J'ai aussi essayé:

aws.getObject(params).on('success', function(data){
    console.log(data); 
});

Cependant, cela n'affiche rien et placer un point d'arrêt montre que l' console.log n'est jamais atteint.

Ce que je fais mal?

198voto

peteb Points 9642

Lorsque vous faites un getObject() de la S3 de l'API, par les docs le contenu de votre fichier sont situés dans l' Body de la propriété, que vous pouvez voir à partir de votre échantillon en sortie. Vous devez disposez d'un code qui ressemble à quelque chose comme

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

Vous ne pouvez pas besoin de créer un nouveau tampon de l' data.Body objet, mais si vous avez besoin vous pouvez utiliser l'exemple ci-dessus pour y parvenir.

4voto

koolhead17 Points 688

Vous pouvez également vous minio-js la bibliothèque du client 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)
  })
})

Disclaimer: je travaille pour Minio Ses open source, S3 compatible objet de stockage écrit dans golang avec le client bibliothèques disponibles dans Java, Python, Js, golang.

3voto

bknights Points 7330

À première vue, il ne semble pas que vous fassiez quelque chose de mal, mais vous ne montrez pas tout votre code. Ce qui suit a fonctionné pour moi lorsque je vérifiais pour la première fois S3 et Node:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X