MailGun WebHook POST body кажется пустым
Я пытаюсь обрабатывать сообщение http post из веб-узла Mailgun bounce. При отправке его на почту Mailgun Postbin все данные, конечно, найдены. Но я теперь отправляю этот POST на свой сервер localhost для целей разработки, и все, что я получаю, это пустой массив json. Я использую Test Webhook.
Цель состоит в том, чтобы сохранить это как можно проще, кроме нашей основной службы. Это для того, чтобы я начал использовать 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");
});
Я запускаю это из Mailgun Test Webhook, используя url, например http://mylocalhostwithpublicip.com:5000/webhooks/mailgun
Структура кода копируется из https://github.com/1lobby/mailgun-js. Наверное, мне не хватает чего-то фундаментального здесь, поскольку я не могу понять это сам.
Ответы
Ответ 1
Причина, по которой вы не видите req.body
, состоит в том, что модуль body-parser
не поддерживает запросы multipart/form-data
. Для этих запросов вам нужен другой модуль, например multer
, busboy
/connect-busboy
, multiparty
или formidable
.
Ответ 2
Если ваш тип содержимого (показывается путем регистрации console.dir(req.headers['content-type'])
) равен 'application/x-www-form-urlencoded'
, и вы используете body-parser
, попробуйте добавить следующую строку:
bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: false }))
Ответ 3
чтобы заставить его работать с 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
});
Ответ 4
var multer = require('multer');
var msg = multer();
post('/track', msg.any(), function(req, res){
console.log(req.body);
}
Ответ 5
Я создаю собственный парсер для получения данных в req.body, когда Content-type = 'multipart/alternative'
https://github.com/josemadev/Multiparser/