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 ответа:
Я не уверен, что это правильный синтаксис. Вы пробовали использовать
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
в моих маршрутах, которая имеет все POSTfield
S как JSON.