2015-01-16 3 views
11

Я пытаюсь обработать сообщение http post из Mailgun bounce webhook. При отправке его в почтовую службу Mailgun все данные, конечно, найдены. Но я теперь отправляю этот POST на свой сервер localhost для целей разработки, и все, что я получаю, это пустой массив json. Я использую Test Webhook.Mailgun webhook POST body кажется пустым

Намерение заключается в том, чтобы сохранить это как можно проще, кроме нашего основного сервиса. Это для того, чтобы я начал использовать nodejs/expressjs, чтобы создать автономный web-сервис для работы в качестве ретранслятора для приема сообщений POST сообщений электронной почты от Mailgun и информировать администраторов о возвращенных адресах электронной почты.

Теперь я не могу понять, почему я не получаю те же данные, что и в 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"); 
}); 

Я бегу это от Test Webhook Mailgun, используя URL-адрес, как http://mylocalhostwithpublicip.com:5000/webhooks/mailgun

структуры кода копируется из https://github.com/1lobby/mailgun-js. Наверное, мне не хватает чего-то фундаментального здесь, поскольку я не могу понять это сам.

+0

Что 'console.dir (req.headers [ 'Content-Type' ]) 'показать, когда вы разместили свой маршрут? – mscdex

+0

Он дает '' multipart/form-data; border = 330afb68-af25-4d0a-89e2-44a10be325fd'' – Qrila

ответ

12

Причина, по которой вы не видите req.body, заселена, потому что модуль body-parser не поддерживает multipart/form-data запросов. Для таких запросов вам нужен другой модуль, такой как multer, busboy/connect-busboy, multiparty, или formidable.

+1

За любовь ... спасибо. Получил это с мультером. – Qrila

+0

Можете ли вы уточнить, как вы это работали с мультером? Я могу получать поля тела, используя multer, но может показаться, что вы получили вложения. – skinneejoe

+0

В моем случае я просто заменил body-parser мультером. Меня интересовало только тело сообщения и не использовало никаких других приложений. – Qrila

2

, чтобы заставить его работать с multer, вы можете использовать .any() (версия 1.1.0)

для меня это сработало так: (предполагается, что multer включен и объявлен как "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

Если тип содержимого (показан вход console.dir(req.headers['content-type'])) является 'application/x-www-form-urlencoded', и вы используете body-parser, попробуйте добавить следующую строку:

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

Этот ответ появился в очереди просмотра низкого качества, по-видимому, потому, что вы не предоставляете никакого объяснения кода. Если этот код отвечает на вопрос, подумайте над добавлением добавления текста, объясняющего код в вашем ответе. Таким образом, вы, скорее всего, получите больше бонусов - и помогите исследователю узнать что-то новое. – lmo

Смежные вопросы