Конфигурация парсера Body Parser
У меня есть приложение, размещенное на Heroku, которое отправляет огромное количество JSON. Первоначально я получал bodyParser - запрос слишком большой ошибки сущности (HTTP 400). Погуглив, я наткнулся на несколько ссылок на вопросы stackru/github
( Sails.js bodyParser - запрос слишком велик для версии 0.10.5) ( https://github.com/balderdashy/skipper/issues/144)
в котором я пытался обновить мой http.js. Теперь мой парсер тела выглядит так:
bodyParser: {
fn: require('skipper'),
options:{
limit: '10mb'
}
}
Это решило ошибку 400, но теперь я получаю ошибку Heroku H13:
2016-08-11T14:02:08.861774+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response"
На данный момент, я немного озадачен. Я посмотрел документацию Heroku об ошибке H13
( https://devcenter.heroku.com/articles/error-codes),
но я не уверен, если
- Мне нужно настроить больше с Heroku (как я бы даже об этом) или
- Сделайте больше с настройкой Sails bodyParser или
- Сочетание двух
В настоящее время я использую версию 0.11.2 Sails.
[Обновить]
Исследования больше приведут меня к этим ссылкам:
https://github.com/balderdashy/sails/issues/2653
https://github.com/balderdashy/skipper/issues/22
Я заметил, что у человека была конфигурация bodyParser вне блока промежуточного программного обеспечения. Я также попытался вытащить свою наружу, и это, кажется, решило проблему Heroku 400 и 503 H13, которую я получал (и я медленно отмахнулся от этой проблемы). Мой новый вопрос: почему работает нижеследующее, тем более что блок комментариев bodyParser находится внутри блока промежуточного программного обеспечения?
module.exports.http = {
/****************************************************************************
* *
* Express middleware to use for every Sails request. To add custom *
* middleware to the mix, add a function to the middleware config object and *
* add its key to the "order" array. The $custom key is reserved for *
* backwards-compatibility with Sails v0.9.x apps that use the *
* `customMiddleware` config option. *
* *
****************************************************************************/
middleware: {
passportInit: require('passport').initialize(),
passportSession: require('passport').session(),
/***************************************************************************
* *
* The order in which middleware should be run for HTTP request. (the Sails *
* router is invoked by the "router" middleware below.) *
* *
***************************************************************************/
order: [
'startRequestTimer',
'cookieParser',
'session',
'passportInit',
'passportSession',
'myRequestLogger',
'bodyParser',
'handleBodyParserError',
'compress',
'methodOverride',
'poweredBy',
'$custom',
'router',
'www',
'favicon',
'404',
'500'
],
/****************************************************************************
* *
* Example custom middleware; logs each request to the console. *
* *
****************************************************************************/
// myRequestLogger: function (req, res, next) {
// console.log("Requested :: ", req.method, req.url);
// return next();
// }
/***************************************************************************
* *
* The body parser that will handle incoming multipart HTTP requests. By *
* default as of v0.10, Sails uses *
* [skipper](http://github.com/balderdashy/skipper). See *
* http://www.senchalabs.org/connect/multipart.html for other options. *
* *
***************************************************************************/
// bodyParser: require('skipper')
},
/***************************************************************************
* *
* The number of seconds to cache flat files on disk being served by *
* Express static middleware (by default, these files are in `.tmp/public`) *
* *
* The HTTP static cache is only active in a 'production' environment, *
* since that's the only time Express will cache flat-files. *
* *
***************************************************************************/
// cache: 31557600000
bodyParser: function () {
var opts = {limit:'10mb'};
var fn;
// Default to built-in bodyParser:
fn = require('skipper');
return fn(opts);
}
};
1 ответ
Вы можете разместить свое промежуточное программное обеспечение внутри и снаружи объекта промежуточного программного обеспечения. Как сказано в документе, вы помещаете вне промежуточного программного обеспечения, которое не следует соглашению app.use(middleware).
Так как ваше промежуточное программное обеспечение bodyparser возвращается require('skipper')({limit:'10mb'})
и не require('skipper')
который сильно отличается, он не следует соглашению app.use(middleware) и должен быть размещен снаружи, в корне модуля http, как вы это сделали.