Intellipaat Back

Explore Courses Blog Tutorials Interview Questions
0 votes
4 views
in AWS by (19.1k points)

In a Node.js project, I am attempting to get data back from S3.

When I use getSignedURL, everything works:

aws.getSignedUrl('getObject', params, function(err, url){

    console.log(url); 

}); 

My params are:

var params = {

              Bucket: "test-aws-imagery", 

              Key: "TILES/Level4/A3_B3_C2/A5_B67_C59_Tiles.par"

If I take the URL output to the console and paste it in a web browser, it downloads the file I need.

However, if I try to use getObject I get all sorts of odd behaviour. I believe I am just using it incorrectly. This is what I've tried:

aws.getObject(params, function(err, data){

    console.log(data); 

    console.log(err); 

}); 

Outputs:

  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

So it appears that this is working properly. However, when I put a breakpoint on one of the console.logs, my IDE (NetBeans) throws an error and refuses to show the value of data. While this could just be the IDE, I decided to try other ways to use getObject.

aws.getObject(params).on('httpData', function(chunk){

    console.log(chunk); 

}).on('httpDone', function(data){

    console.log(data); 

});

This does not output anything. Putting a breakpoint in shows that the code never reaches either of the console.logs. I also tried:

aws.getObject(params).on('success', function(data){

    console.log(data); 

});

However, this also does not output anything and placing a breakpoint shows that the console.log is never reached.

What am I doing wrong?

1 Answer

0 votes
by (44.4k points)

When doing a getObject() from the S3 API, per the docs the contents of your file are located in the Body property, which you can see from your sample output. You should have code that looks something like the following

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

});

You may not need to create a new buffer from the data.Body object but if you need you can use the sample above to achieve that.

Related questions

Want to get 50% Hike on your Salary?

Learn how we helped 50,000+ professionals like you !

31k questions

32.8k answers

501 comments

693 users

Browse Categories

...