body-parser получает пустое тело, когда content-type имеет несколько значений
Я обновляю с express 3 до 4, промежуточное ПО для разбора тела изменилось, поэтому я использую body-parser, и это выглядит нормально в большинстве ситуаций:
var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
Но у меня есть сторонний сервис, который вызовет один из моих конкретных url для уведомления сообщений, он прекрасно работает в express 3, но не удалось в express 4, потому что req.body пусто
Я отлаживаю заголовок запроса, обнаружив, что Content-Type является application/x-www-form-urlencoded; text/html; charset=UTF-8, а не application/x-www-form-urlencoded
Поэтому я проверил в curl, когда я удаляю text/html; charset=UTF-8, req.body может показать мое тело столба именно так.
Так что же мне делать тогда? это сторонний сервис, это не причина для них менять свой код, есть ли способ узла? tks
2 ответов:
Согласно Доку http://greenbytes.de/tech/webdav/rfc2616.html#rfc.section.14.17 , заголовок запроса
Content-Typeдеформирован. таким образом, проблема заключается в том, что заголовок запроса имеет два типа носителя, а промежуточное программное обеспечение Body-parser обрабатывает егоtext/html.Наконец, я написал промежуточное программное обеспечение специально для этого запроса, обнаруживаю, если там содержатся слова
application/x-www-form-urlencoded, то яqs.parse(buffString)решаю его временноapp.use(function(req, res, next){ if(/^\/pay\/ali\/notify/.test(req.originalUrl)){ req.body = req.body || {}; if ('POST' != req.method) return next(); var contenttype = req.headers['content-type']; if(!/application\/x-www-form-urlencoded/.test(contenttype)) return next(); req._body = true; var buf = ''; req.setEncoding('utf8'); req.on('data', function(chunk){ buf += chunk }); req.on('end', function(){ req.body = qs.parse(buf); next(); }); }else{ next(); } });
Или вы можете просто заставить
urlencodedдля Alipay, какapp.post('/alipay', bodyParser.urlencoded({ extended: true, type: function() {return true;} }))
Comments