Search code examples
node.jsamazon-s3graphicsmagick

NodeJs Failure: Expected params.Body to be a string, Buffer, Stream, Blob, or typed array object


I am using GraphicsMagic to modify image. After drawing text on image I need to upload result image to s3 bucket. However I suspect toBuffer() is returning empty result because I am getting following error:

Failure: Expected params.Body to be a string, Buffer, Stream, Blob, or typed array object

Here is my code:

 s3.getObject({Bucket: srcBucket, Key: srcKey}).promise()
.then(data => gm(data.Body)
  .fill('white')
  .stroke('black', 1)
  .drawText(0, -60, text.toUpperCase(), 'center')
  .toBuffer(imageType,function (err, buffer) {
    if (err) return handle(err);
    console.log('done!');
  })
)
.then(buffer => s3.putObject({
    Body: buffer,
    Bucket: dstBucket,
    ContentType: buffer.ContentType,
    Key: dstKey,
  }).promise()

)
.then(() => callback(null, {
  statusCode: 200,
  body: JSON.stringify({
    url: dstKey
  })
  })
)
.catch(err => callback(err))

Solution

  • I think you can only get the buffer from the callback provided in toBuffer. I assume you have some function defined as callback in your code:

    s3.getObject({Bucket: srcBucket, Key: srcKey}).promise()
      .then(data => gm(data.Body)
        .fill('white')
        .stroke('black', 1)
        .drawText(0, -60, text.toUpperCase(), 'center')
        .toBuffer(imageType,function (err, buffer) {
          if (err) return handle(err);
          s3.putObject({
            Body: buffer,
            Bucket: dstBucket,
            ContentType: buffer.ContentType,
            Key: dstKey,
          }).promise()
            .then(() => callback(null, {
                statusCode: 200,
                body: JSON.stringify({
                  url: dstKey
                })
              })
            )
            .catch(err => callback(err))
          // console.log('done!');
        })
      )