【问题标题】:Mailgun webhook POST body seems emptyMailgun webhook POST 正文似乎是空的
【发布时间】:2015-03-15 02:24:00
【问题描述】:

我正在尝试处理来自 Mailgun 反弹 webhook 的 http post 消息。将其发送到 Mailgun 的 Postbin 服务时,当然会找到所有数据。但是我现在将该 POST 发送到我的本地主机服务器以用于开发目的,而我得到的只是空的 json 数组。我使用测试 Webhook。

除了我们的主要服务之外,我们的意图是尽可能保持简单。我开始使用 nodejs/expressjs 创建独立的 web 服务,作为中继接收来自 Mailgun 的电子邮件退回的 POST 消息,并通知管理员退回的电子邮件地址。

现在我想不通为什么我没有得到与 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 的测试 Webhook 中使用像 http://mylocalhostwithpublicip.com:5000/webhooks/mailgun 这样的 url 运行它

代码结构复制自https://github.com/1lobby/mailgun-js。可能我在这里遗漏了一些基本的东西,因为我自己无法弄清楚。

【问题讨论】:

  • console.dir(req.headers['content-type']) 放置在您的路由处理程序中时会显示什么?
  • 它给了'multipart/form-data; boundary=330afb68-af25-4d0a-89e2-44a10be325fd'

标签: node.js webhooks mailgun


【解决方案1】:

您没有看到req.body 填充的原因是body-parser 模块不支持multipart/form-data 请求。对于这些类型的请求,您需要不同的模块,例如 multerbusboy/connect-busboymultipartyformidable

【讨论】:

  • 您能详细说明您是如何使用 multer 进行这项工作的吗?我可以使用 multer 接收正文字段,但似乎可以让附件通过。
  • 就我而言,我只是用 multer 替换了 body-parser。我只对邮件正文感兴趣,没有使用任何其他附件。
  • body-parser 支持 urlencoder,参见 'dbarabander' 的回复。 Mailgun 使用此标头,因此他的回答对我有所帮助。
【解决方案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】:

      当 Content-type = 'multipart/alternative' 时,我制作了一个自定义解析器来获取 req.body 中的数据

      https://github.com/josemadev/Multiparser/

      【讨论】:

        猜你喜欢
        • 2015-01-28
        • 1970-01-01
        • 2020-12-25
        • 2020-01-12
        • 2015-11-13
        • 2016-07-30
        • 2013-01-19
        • 2014-03-13
        • 2014-11-08
        相关资源
        最近更新 更多