2017-12-26 164 views
9

Próbuję uzyskać treść żądania Amazon SNS, ale jest ono zwracane jako obiekt. Mogę uzyskać nagłówki z żądania bez żadnych problemów. (Req.header ('x-AMZ-SNS-message-type'))Uzyskiwanie treści żądania POST (Amazon SNS) w Nodejs

var msgBody = req.body.Message; 

Zmienna msgBody jest zwracany jako obiekt, gdzie oczekiwać, aby uzyskać wartość ciągu z żądania.

Używam Express i ciało-parser z następujących opcji:

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

Format wniosek jest następujący (skrócona do łatwego czytania):

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

Co to jest wynik polecenia 'console.log (typeof req.body.Message)'? – Anuruddha

Odpowiedz

0

"Message", który cię szukamy jest częścią usztywnionego JSON w twojej prośbie.

Powinieneś być w stanie uzyskać do niego dostęp za pomocą ...

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

Próbowałem, ale daje mi to "niespodziewany znak w jsonie na pozycji 0". samo req jest definitywnie zdefiniowane, ponieważ mam dostęp do nagłówków. –

+0

Co jest w 'req.body'? – dashmug

+0

jest obiekt. daje obiekt {}, gdy konsola jest logowana. –

3

console.log("stringified json") będzie analizować ciąg JSON przed wydrukowaniem go do konsoli. Jeśli jednak sprawdzisz numer typeof req.body.Message, zobaczysz go jako typ łańcucha zgodnie z oczekiwaniami.

console.log(typeof req.body.Message)

Jest to metoda console.log() robi konwersję tyłu widać.

Jeśli potrzebujesz, możesz użyć JSON.stringify({your json object}), aby uzyskać usztywnioną wersję obiektów.

Poniżej znajduje się kod (index.js), który symuluje twoją sprawę za pomocą dostarczonego ładunku danych w pytaniu.

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