tibsar tibsar - 7 months ago 825
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

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 behavior. 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.log
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
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.log
s. 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?

Answer

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.

Comments