tibsar tibsar - 2 years ago 2090
Javascript Question

How to get response from S3 getObject in Node.js?

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

When I use

, everything works:

aws.getSignedUrl('getObject', params, function(err, 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
I get all sorts of odd behavior. I believe I am just using it incorrectly. This is what I've tried:

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


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 ... > }


So it appears that this is working properly. However, when I put a breakpoint on one of the
s, 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

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

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

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

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

What am I doing wrong?

Answer Source

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.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download