2017-12-26 22 views
9

Amazon SNSリクエストの本体を取得しようとしていますが、オブジェクトとして返されます。リクエストからヘッダーを問題なく取得できます。 (req.header( 'X-AMZ-SNS-メッセージタイプ'))NodejsのPOST要求(Amazon SNS)本体を取得する

var msgBody = req.body.Message; 

msgBody変数がIがリクエストから文字列値を得ることを期待オブジェクトとして返されます。

私は、次のオプションを明示し、ボディパーサーを使用しています:

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

    } 
} 
+0

'console.log(typeof req.body.Message)'の出力は何ですか? – Anuruddha

答えて

0

「メッセージ」を、あなたが探しているのは、あなたの要求で文字列化されたJSONの一部です。あなたが使用してアクセスすることができるはず

...

const msgBody = JSON.parse(req.body.Message).Message; 
+0

私はそれを試しましたが、それは私に "位置0のjsonの予期しないトークンu"を与えます。ヘッダーにアクセスできるので、req自体は明確に定義されています。 –

+0

'req.body'には何がありますか? – dashmug

+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!')) 
関連する問題