Mailgun webhook POST 正文似乎是空的
Mailgun webhook POST body seems empty
我正在尝试处理来自 Mailgun 退回 Webhook 的 http post 消息。当将它发送到 Mailgun 的 Postbin 服务时,当然会找到所有数据。但我现在将 POST 发送到我的本地主机服务器用于开发目的,我得到的只是空 json 数组。我使用测试 Webhook。
目的是在我们的主要服务之外尽可能保持简单。那是因为我开始使用 nodejs/expressjs 创建独立的网络服务,作为中继接收来自 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 使用 url 就像 http://mylocalhostwithpublicip.com:5000/webhooks/mailgun
代码结构复制自https://github.com/1lobby/mailgun-js。可能我在这里遗漏了一些基本的东西,因为我自己也弄不明白。
您没有看到 req.body
的原因是 body-parser
模块不支持 multipart/form-data
请求。对于这些类型的请求,您需要一个不同的模块,例如 multer
, busboy
/connect-busboy
, multiparty
, or formidable
.
要使其与 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
});
如果您的内容类型(通过记录 console.dir(req.headers['content-type'])
显示)是 'application/x-www-form-urlencoded'
,并且您使用的是 body-parser
,请尝试添加以下行:
bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: false }))
var multer = require('multer');
var msg = multer();
post('/track', msg.any(), function(req, res){
console.log(req.body);
}
当 Content-type = 'multipart/alternative'
时,我为 req.body 中的数据创建了一个自定义解析器
我正在尝试处理来自 Mailgun 退回 Webhook 的 http post 消息。当将它发送到 Mailgun 的 Postbin 服务时,当然会找到所有数据。但我现在将 POST 发送到我的本地主机服务器用于开发目的,我得到的只是空 json 数组。我使用测试 Webhook。
目的是在我们的主要服务之外尽可能保持简单。那是因为我开始使用 nodejs/expressjs 创建独立的网络服务,作为中继接收来自 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 使用 url 就像 http://mylocalhostwithpublicip.com:5000/webhooks/mailgun
代码结构复制自https://github.com/1lobby/mailgun-js。可能我在这里遗漏了一些基本的东西,因为我自己也弄不明白。
您没有看到 req.body
的原因是 body-parser
模块不支持 multipart/form-data
请求。对于这些类型的请求,您需要一个不同的模块,例如 multer
, busboy
/connect-busboy
, multiparty
, or formidable
.
要使其与 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
});
如果您的内容类型(通过记录 console.dir(req.headers['content-type'])
显示)是 'application/x-www-form-urlencoded'
,并且您使用的是 body-parser
,请尝试添加以下行:
bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: false }))
var multer = require('multer');
var msg = multer();
post('/track', msg.any(), function(req, res){
console.log(req.body);
}
当 Content-type = 'multipart/alternative'
时,我为 req.body 中的数据创建了一个自定义解析器