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/