Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting the body of POST request(Amazon SNS ) in Nodejs

I am trying to get the body of an Amazon SNS request but it is returned as an object. I can get the headers from the request without any problems. (req.header('x-amz-sns-message-type'))

var msgBody = req.body.Message; 

The msgBody variable is returned as an object where I expect to get the string value from the request.

I am using express and body-parser with the following options:

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

The request format is as follows (shortened for easy reading):

POST /createLog/slackLogSNS/ HTTP/1.1
x-amz-sns-message-type: Notification
x-amz-sns-message-id: 3f71e0db-a9b1-5092-96f4-b26015676ba0

{
  "Type" : "Notification",
  "MessageId" : "3f71e0db-a9b1-5092-96f4-b26015676ba0",
  "TopicArn" : "arn:aws:sns:us-east-2:043886476179:testslackSNS",
  "Subject" : "hghghgfhgfhg",
  "Message" : "{\n  \"Type\" : \"Notification\",\n  \"MessageId\" : \"22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324\",\n  \"TopicArn\" : \"arn:aws:sns:us-west-2:123456789012:MyTopic\",\n  \"Subject\" : \"My First Message\",\n  \"Message\" : \"Hello world!\",\n  \"Timestamp\" : \"2012-05-02T00:54:06.655Z\",\n  \"SignatureVersion\" : \"1\",\n  \"Signature\" : \"EXAMPLEw6JRNwm1LFQL4ICB0bnXrdB8ClRMTQFGBqwLpGbM78tJ4etTwC5zU7O3tS6tGpey3ejedNdOJ+1fkIp9F2/LmNVKb5aFlYq+9rk9ZiPph5YlLmWsDcyC5T+Sy9/umic5S0UQc2PEtgdpVBahwNOdMW4JPwk0kAJJztnc=\",\n  \"SigningCertURL\" : \"https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem\",\n  \"UnsubscribeURL\" : \"https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:123456789012:MyTopic:c9135db0-26c4-47ec-8998-413945fb5a96\"\n}",

  }
}
like image 742
Code Bunny Avatar asked Dec 26 '17 09:12

Code Bunny


1 Answers

console.log("stringified json") will parse the JSON string before printing it to the console. However if you check the typeof req.body.Message you'll see it as string type as expected.

console.log(typeof req.body.Message)

It's the console.log() method doing the conversion behind the seen.

if you need you could use JSON.stringify({your json object}) to get a stringified version of the objects.

Below is the code(index.js) to simulate your case with the provided request payload in the question.

const express = require('express')
const bodyParser = require('body-parser')
const app = express()
app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing

app.post('/',  function(req, res) {
  // get posts
  console.log(req.body);
  var x = req.body.Message;
  console.log(typeof req.body.Message) // string
  console.log(x.Type) // undefined
  res.json({"a" : "test response"})
});

app.listen(3000, () => console.log('Example app listening on port 3000!'))
like image 151
Anuruddha Avatar answered Oct 16 '22 08:10

Anuruddha