在Nodejs中获取POST请求(Amazon SNS)的主体

时间:2017-12-26 09:08:38

标签: node.js amazon-web-services post amazon-sns

我正在尝试获取Amazon SNS请求的正文,但它作为对象返回。我可以毫无问题地从请求中获取标题。 (req.header(' X-AMZ-SNS-消息类型'))

var msgBody = req.body.Message; 

msgBody变量作为一个对象返回,我希望从请求中获取字符串值。

我正在使用express和body-parser,其中包含以下选项:

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

请求格式如下(缩短以便于阅读):

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}",

  }
}

2 个答案:

答案 0 :(得分:3)

console.log("stringified json")将在将JSON字符串打印到控制台之前对其进行解析。但是,如果您检查typeof req.body.Message,则会按预期将其视为字符串类型。

console.log(typeof req.body.Message)

这是在看到后面进行转换的console.log()方法。

如果需要,可以使用JSON.stringify({your json object})获取对象的字符串版本。

下面是代码(index.js),用于在问题中使用提供的请求有效负载模拟您的案例。

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!'))

答案 1 :(得分:0)

您正在寻找的“消息”是您请求中字符串化JSON的一部分。

您应该可以使用...

访问它
const msgBody = JSON.parse(req.body.Message).Message;