我正在尝试通过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);
...
答案 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问题上讨论了这个问题here和here。我发现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。