Webhook for Mailgun POST?

时间:2014-11-30 22:50:07

标签: meteor webhooks iron-router mailgun

我正在尝试通过Mailgun webhook将电子邮件消息存储为Mongo.Collection中的JSON(由Mailgun解析)。我设置了铁路由器服务器端路由来处理请求,但this.request.body为空。我正在使用Mailgun"发送样本POST"发送请求,POST看起来很好用例如http://requestb.in/。我希望request.body能拥有数据,如How do I access HTTP POST data from 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 个答案:

答案 0 :(得分:0)

我不确定这是正确的语法。您是否尝试过使用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'
  }
);

答案 1 :(得分:0)

我认为问题是Mailgun发送了一个多部分POST请求,例如它发送"字段"以及"文件" (即附件)和铁路由器没有为多部分请求设置主体解析器。在铁路由器的Github问题上讨论了这个问题herehere。我发现this评论特别有帮助,现在我可以正确解析Mailgun的示例POST。

为了实现这一点,在一个新的Meteor项目中,我做了

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

在根级packages.json我有

{
    "busboy": "0.2.9"
}

使用meteorhacks:npm包,使" busboy" 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作为JSON。