2015-01-16 13 views
11

Ich versuche, http Post Nachricht von Mailgun Bounce Webhook zu behandeln. Beim Versand an den Postbin-Dienst von Mailgun werden natürlich alle Daten gefunden. Aber ich sende diesen POST nun zu Entwicklungszwecken an meinen localhost-Server, und alles, was ich bekomme, ist ein leeres json-Array. Ich benutze Test-Webhook.Mailgun Webhook POST Körper scheint leer

Absicht ist, dies so einfach wie möglich neben unserem Hauptservice zu halten. Ich benutze nodejs/expressjs, um einen eigenständigen Webservice zu erstellen, der als Relay zum Empfangen von POST-Nachrichten von E-Mail-Bounces von Mailgun und zum Informieren von Administratoren über abgefangene E-Mail-Adressen dient.

Jetzt kann ich nicht herausfinden, warum ich nicht die gleichen Daten bekomme, wie in Postbin sichtbar ist.

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"); 
}); 

Ich führe dies aus Mailgun von Test Webhook URL wie http://mylocalhostwithpublicip.com:5000/webhooks/mailgun

-Code-Struktur wird aus https://github.com/1lobby/mailgun-js kopiert. Wahrscheinlich vermisse ich hier etwas Grundlegendes, da ich es selbst nicht herausfinden kann.

+0

Was bedeutet 'console.dir (req.headers [ 'content-type' ]) 'zeigen, wenn in Ihrem Routen-Handler platziert? – mscdex

+0

Es gibt ''multipart/form-data; Grenze = 330afb68-af25-4d0a-89e2-44a10be325fd'' – Qrila

Antwort

12

Der Grund, warum Sie req.body nicht sehen, ist, weil das body-parser Modul multipart/form-data Anfragen nicht unterstützt. Für diese Art von Anforderungen benötigen Sie ein anderes Modul, z. B. multer, busboy/connect-busboy, multiparty oder formidable.

+1

Für die Liebe von ... danke. Verstanden mit Multer. – Qrila

+0

Können Sie erläutern, wie Sie das mit Multer arbeiten? Ich kann Körperfelder mit Hilfe von Multer empfangen, aber ich kann scheinen, dass die Anhänge durchkommen. – skinneejoe

+0

In meinem Fall habe ich Body-Parser einfach durch Multer ersetzt. Ich war nur am Nachrichtenkörper interessiert und habe keine anderen Anhänge verwendet. – Qrila

2

, um es mit multer funktioniert, können Sie .any() (Version 1.1.0)

für mich funktionierte es wie folgt aus: (unter der Annahme multer wird als "multer" aufgenommen und erklärt)

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

Wenn Ihr Content-Type (dargestellt durch console.dir(req.headers['content-type']) Anmeldung) 'application/x-www-form-urlencoded' ist, und Sie verwenden body-parser, versuchen Sie die folgende Zeile hinzufügen:

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

Diese Antwort wurde in der Bewertungswarteschlange mit niedriger Qualität angezeigt, vermutlich weil Sie keine Erklärung für den Code bereitstellen. Wenn dieser Code die Frage beantwortet, sollten Sie in Erwägung ziehen, etwas Text hinzuzufügen, der den Code in Ihrer Antwort erklärt. Auf diese Weise erhalten Sie mit höherer Wahrscheinlichkeit mehr Upvotes - und helfen dem Fragesteller, etwas Neues zu lernen. – lmo