Webhook для Почты Mailgun?


Я пытаюсь хранить сообщения электронной почты как JSON (как разбирается Mailgun) в Mongo.Сбор через веб-крючок Mailgun. Я настроил серверный маршрут iron-router для обработки запроса, но this.request.body пуст. Я использую Mailgun "отправить образец сообщение", чтобы отправить запрос, и пост выглядит отлично, используя например, http://requestb.in/. Я надеялся, что эту просьбу.тело будет иметь данные, как указано в Как получить доступ к данным HTTP POST от meteor?. Что я делаю не так?

Router.map(function () {
  this.route('insertMessage', {
    where: 'server',
    path: '/api/insert/message',
    action: function() {
      var req = this.request;
      var res = this.response;

      console.log(req.body);
      ...
2 2

2 ответа:

Я не уверен, что это правильный синтаксис. Вы пробовали использовать Router.route ?

Router.route('insertMessage', 
  function () {
    // NodeJS request object
    var request = this.request;

    // NodeJS  response object
    var response = this.response;

    console.log("========= request: =============");
    console.log(request);

    // EDIT: also check out this.params object
    console.log("========= this.params: =============");
    console.log(this.params);

    // EDIT 2: close the response. oops.
    return response.end();
  }, 
  {
    where: 'server',
    path: '/api/insert/message'
  }
);

Я думаю, что проблема заключается в том, что Mailgun отправляет многоэлементный запрос POST, например, он отправляет "поля", а также "файлы" (т. е. вложения), и iron-router не настраивает синтаксический анализатор тела для многоэлементных запросов. Этот вопрос обсуждается здесь и здесь по вопросам GitHub железного маршрутизатора. Я нашел этот комментарий особенно полезным, и теперь я могу правильно разобрать образец сообщения Mailgun.

Чтобы заставить это работать, в новом проекте Meteor я сделал

$ meteor add iron:router
$ meteor add meteorhacks:npm

В a корневой Уровень packages.json у меня есть

{
    "busboy": "0.2.9"
}

, который, используя пакет meteorhacks:npm, делает пакет NPM "помощник официанта" доступным для использования на сервере через Meteor.npmRequire.

Наконец, в server/rest-api.js у меня есть

Router.route('/restful', {where: 'server'})
  .post(function () {
    var msg = this.request.body;
    console.log(msg);
    console.log(_.keys(msg));
    this.response.end('post request\n');
  });

var Busboy = Meteor.npmRequire("Busboy");

Router.onBeforeAction(function (req, res, next) {
  if (req.method === "POST") {
    var body = {}; // Store body fields and then pass them to request.
    var busboy = new Busboy({ headers: req.headers });
    busboy.on("field", function(fieldname, value) {
      body[fieldname] = value;
    });
    busboy.on("finish", function () {
      // Done parsing form
      req.body = body;
      next();
    });
    req.pipe(busboy);
  }
});

Таким образом, я могу игнорировать файлы (т. е. у меня нет части busboy.on("file") и иметь доступную часть this.request.body в моих маршрутах, которая имеет все POST field S как JSON.