2015-01-16 10 views
11

Próbuję obsłużyć wiadomość http post z webhooka Bounce Mailgun. Wysyłając go do usługi Postbin Mailguna wszystkie dane znajdują się oczywiście. Ale teraz wysyłam ten POST do mojego serwera localhost dla celów programistycznych i dostaję tylko pustą tablicę json. Używam webhooka testowego.Webhook Mailgun Ciało POST wydaje się puste

Celem jest utrzymanie tego tak prostego, jak to możliwe poza naszą główną usługą. To dlatego, że zacząłem używać nodejs/expressjs do tworzenia samodzielnych usług sieciowych do pracy jako przekaźnik do odbierania wiadomości POST wiadomości e-mail odskakujących z Mailgun i informowania administratorów o odbijanych adresach e-mail.

Teraz nie mogę sobie wyobrazić, dlaczego nie otrzymuję tych samych danych, które są widoczne w Postbin.

var express = require('express'); 
var app = express(); 
var bodyParser = require('body-parser'); 
var mailgun = require('mailgun-js')({apiKey: 'key-...', domain: 'mymailgundomain.com'}); 

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

function router(app) { 
    app.post('/webhooks/*', function (req, res, next) { 
    var body = req.body; 

    if (!mailgun.validateWebhook(body.timestamp, body.token, body.signature)) { 
     console.error('Request came, but not from Mailgun'); 
     res.send({ error: { message: 'Invalid signature. Are you even Mailgun?' } }); 
     return; 
    } 

    next(); 
    }); 

    app.post('/webhooks/mailgun/', function (req, res) { 
    // actually handle request here 
    console.log("got post message"); 
    res.send("ok 200"); 
    }); 
} 

app.listen(5000, function(){ 
    router(app); 
    console.log("listening post in port 5000"); 
}); 

biegnę to z testu Webhook Mailgun Korzystanie url jak http://mylocalhostwithpublicip.com:5000/webhooks/mailgun

struktury kod jest skopiowany z https://github.com/1lobby/mailgun-js. Prawdopodobnie brakuje tu czegoś fundamentalnego, ponieważ sam nie potrafię tego rozgryźć.

+0

Co 'console.dir (req.headers [ 'content-type' ]) 'show po umieszczeniu w treserze trasy? – mscdex

+0

Daje '' wieloczęściowe/dane-formularzy; boundary = 330afb68-af25-4d0a-89e2-44a10be325fd'' – Qrila

Odpowiedz

12

Powodem, dla którego nie widzisz req.body, ponieważ moduł body-parser nie obsługuje żądań , nie obsługuje żądań . W przypadku tego typu żądań potrzebny jest inny moduł, taki jak multer, busboy/connect-busboy, multiparty lub .

+1

Za miłość ... dzięki. Mam to z multer. – Qrila

+0

Czy możesz wyjaśnić, jak to działa z multer? Mogę odbierać pola ciała za pomocą multera, ale wydaje się, że dostaję załączniki. – skinneejoe

+0

W moim przypadku po prostu zastąpiłem parser ciała multer. Interesowało mnie tylko ciało wiadomości i nie korzystałem z żadnych innych załączników. – Qrila

2

aby pracować z multer, można użyć .any() (w wersji 1.1.0)

dla mnie to działało tak: (zakładając multer jest wliczone w cenę i zadeklarowane jako "multer")

post('/track', multer.any(),function(req, res){ 
    //if body is a string, parse the json 
    var data=(typeof req.body=='string')?JSON.parse(req.body):req.body; 
    //if data is an object but you can't verify if a field exists with hasOwnProperty, force conversion with JSON 
    if(typeof data=='object' && typeof data.hasOwnProperty=='undefined') 
     data=JSON.parse(JSON.stringify(data)); 
     //data is your object 
}); 
5

Jeśli Twój typ zawartości (pokazane logując console.dir(req.headers['content-type'])) jest 'application/x-www-form-urlencoded' i używasz body-parser, spróbuj dodać następujący wiersz:

bodyParser = require('body-parser') 
    app.use(bodyParser.urlencoded({ extended: false })) 
0
var multer = require('multer'); 
var msg = multer(); 
post('/track', msg.any(), function(req, res){ 
    console.log(req.body); 
} 
+0

Ta odpowiedź pojawiła się w kolejce sprawdzania niskiej jakości, prawdopodobnie dlatego, że nie podano żadnego wyjaśnienia kodu. Jeśli ten kod odpowiada na pytanie, rozważ dodanie dodania tekstu wyjaśniającego kod w odpowiedzi. W ten sposób znacznie bardziej prawdopodobne jest, że uzyskasz więcej upvotes - i pomożesz osobie pytającej nauczyć się czegoś nowego. – lmo