it-swarm.com.ru

Ошибка: объект запроса слишком велик

Я получаю следующую ошибку с экспресс:

Error: request entity too large
    at module.exports (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/node_modules/raw-body/index.js:16:15)
    at json (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/middleware/json.js:60:5)
    at Object.bodyParser [as handle] (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js:53:5)
    at next (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/proto.js:193:15)
    at Object.cookieParser [as handle] (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js:60:5)
    at next (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/proto.js:193:15)
    at Object.logger (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/middleware/logger.js:158:5)
    at next (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/proto.js:193:15)
    at Object.staticMiddleware [as handle] (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/middleware/static.js:55:61)
    at next (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/proto.js:193:15)
TypeError: /Users/michaeljames/Documents/Projects/Proj/mean/app/views/includes/foot.jade:31
    29| script(type="text/javascript", src="/js/socketio/connect.js")
    30| 
  > 31| if (req.Host='localhost')
    32|     //Livereload script rendered 
    33|     script(type='text/javascript', src='http://localhost:35729/livereload.js')  
    34| 

Cannot set property 'Host' of undefined
    at eval (eval at <anonymous> (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/jade/lib/jade.js:152:8), <anonymous>:273:15)
    at /Users/michaeljames/Documents/Projects/Proj/mean/node_modules/jade/lib/jade.js:153:35
    at Object.exports.render (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/jade/lib/jade.js:197:10)
    at Object.exports.renderFile (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/jade/lib/jade.js:233:18)
    at View.exports.renderFile [as engine] (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/jade/lib/jade.js:218:21)
    at View.render (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/lib/view.js:76:8)
    at Function.app.render (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/lib/application.js:504:10)
    at ServerResponse.res.render (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/lib/response.js:801:7)
    at Object.handle (/Users/michaeljames/Documents/Projects/Proj/mean/config/express.js:82:29)
    at next (/Users/michaeljames/Documents/Projects/Proj/mean/node_modules/express/node_modules/connect/lib/proto.js:188:17)

POST /api/0.1/people 500 618ms

Я использую стэк. У меня есть следующие заявления об использовании в моем express.js

//Set Request Size Limit
app.use(express.limit(100000000));

В fiddler я вижу заголовок content-length со значением: 1078702

Я считаю, что это в октетах, это 1,0787 мегабайт.

Я понятия не имею, почему Express не позволяет мне публиковать массив json, который я публиковал ранее, в другом проекте Express, который не использовал структуру проекта среднего стека.

348
mike james

Недавно у меня была та же ошибка, и все решения, которые я нашел, не работали.

После некоторых копаний я обнаружил, что настройка app.use(express.bodyParser({limit: '50mb'})); правильно установила лимит. 

При добавлении console.log('Limit file size: '+limit); в node_modules/express/node_modules/connect/lib/middleware/json.js:46 и перезапуске узла, я получаю этот вывод в консоли: 

Limit file size: 1048576
connect.multipart() will be removed in connect 3.0
visit https://github.com/senchalabs/connect/wiki/Connect-3.0 for alternatives
connect.limit() will be removed in connect 3.0
Limit file size: 52428800
Express server listening on port 3002

Мы видим, что сначала при загрузке модуля connect ограничение устанавливается в 1 МБ (1048576 байт). Затем, когда я устанавливаю ограничение, снова вызывается console.log, и на этот раз ограничение составляет 52428800 (50 МБ). Тем не менее, я все еще получаю 413 Request entity too large.

Затем я добавил console.log('Limit file size: '+limit); в node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10 и увидел другую строку в консоли при вызове маршрута с большим запросом (до вывода ошибки): 

Limit file size: 1048576

Это означает, что каким-то образом connect сбрасывает параметр limit и игнорирует то, что мы указали. Я попытался указать параметры bodyParser в определении маршрута по отдельности, но тоже не повезло.

Хотя я не нашел подходящего способа установить его навсегда, вы можете "patch" напрямую в модуле. Если вы используете Express 3.4.4, добавьте это в строку 46 node_modules/express/node_modules/connect/lib/middleware/json.js:

limit = 52428800; // for 50mb, this corresponds to the size in bytes

Номер строки может отличаться, если вы не используете одну и ту же версию Express . Обратите внимание, что это плохая практика и она будет перезаписана, если вы обновите свой модуль.

Таким образом, это временное решение работает на данный момент, но как только решение найдено (или модуль исправлен, если это проблема модуля), вы должны соответствующим образом обновить свой код.

Я открыл вопрос на их Github об этой проблеме.

[edit - нашел решение]

После некоторых исследований и тестирования я обнаружил, что при отладке я добавил app.use(express.bodyParser({limit: '50mb'}));, но afterapp.use(express.json());. Express тогда установил бы глобальный лимит в 1mb, потому что первый синтаксический анализатор, с которым он столкнулся при запуске сценария, был express.json(). Перемещение bodyParser над ним сделало свое дело.

Тем не менее, метод bodyParser() устарел в Connect 3.0 и не должен использоваться. Вместо этого вы должны явно объявить ваши парсеры, вот так:

app.use(express.json({limit: '50mb'}));
app.use(express.urlencoded({limit: '50mb'}));

В случае, если вам нужна многочастная (для загрузки файлов) см. это сообщение .

Второе редактирование

Обратите внимание, что в Express 4 вместо express.json() и express.urlencoded() вам потребуется модуль body-parser и использовать его методы json() и urlencoded(), например:

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));

Если параметр extended явно не определен для bodyParser.urlencoded(), он выдаст предупреждение (body-parser deprecated undefined extended: provide extended option). Это связано с тем, что эта опция потребуется в следующей версии и not больше не будет обязательной. Для получения дополнительной информации о параметре extended, пожалуйста, обратитесь к readme of body-parser.

769
Samuel Bolduc

Я использую Express 4.

В моем случае было недостаточно добавить следующие строки:

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));

Я попытался добавить параметр parameterLimit в функцию urlencoded, как сказано в документации, и ошибка больше не появляется.

Опция parameterLimit контролирует максимальное количество параметров которые разрешены в данных в кодировке URL. Если запрос содержит больше параметры, чем это значение, 413 будет возвращено клиенту . По умолчанию 1000.

Попробуйте с этим кодом:

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: "50mb"}));
app.use(bodyParser.urlencoded({limit: "50mb", extended: true, parameterLimit:50000}));
80
slorenzo

Если кто-то попробовал все ответы, но пока не добился успеха и использует NGINX для размещения сайта, добавьте эту строку в/etc/nginx/sites-available

client_max_body_size 100M; #100mb
34
Alexander

Я не думаю, что это явный глобальный лимит размера, а именно connect.json ограничение промежуточного программного обеспечения . Это 100 КБ по умолчанию, когда вы используете express.bodyParser() и не предоставляете опцию limit.

Пытаться:

app.post('/api/0.1/people', express.bodyParser({limit: '5mb'}), yourHandler);
28
Peter Lyons

в моем случае .. настройка parameterLimit:50000 исправила проблему

app.use( bodyParser.json({limit: '50mb'}) );
app.use(bodyParser.urlencoded({
  limit: '50mb',
  extended: true,
  parameterLimit:50000
}));
11
Mohanad Obaid

2016, ничего из вышеперечисленного не работало на меня, пока я явно не установил «тип» в дополнение к «пределу» для bodyparser, пример:

  var app = express();
  var jsonParser       = bodyParser.json({limit:1024*1024*20, type:'application/json'});
  var urlencodedParser = bodyParser.urlencoded({ extended:true,limit:1024*1024*20,type:'application/x-www-form-urlencoding' })

  app.use(jsonParser);
  app.use(urlencodedParser);
9
user1709076

Следующее сработало для меня ... Просто используйте 

app.use(bodyParser({limit: '50mb'}));

вот и все.

Перепробовал все выше и никто не работал. Обнаружил, что, хотя мы используем как следующее,

app.use(bodyParser());
app.use(bodyParser({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb'}));

определяется только 1-я функция app.use(bodyParser());, а последние две строки игнорируются.

См. https://github.com/expressjs/body-parser/issues/176 >> см. «Комментарии Дугвилсона 17 июня 2016 г.»

7
Vivek22

Маленький старый пост, но у меня была такая же проблема

Используя экспресс 4. + Мой код выглядит следующим образом, и он прекрасно работает после двух дней всестороннего тестирования.

var url         = require('url'),
    homePath    = __dirname + '/../',
    apiV1       = require(homePath + 'api/v1/start'),
    bodyParser  = require('body-parser').json({limit:'100mb'});

module.exports = function(app){
    app.get('/', function (req, res) {
        res.render( homePath + 'public/template/index');
    });

    app.get('/api/v1/', function (req, res) {
        var query = url.parse(req.url).query;
        if ( !query ) {
            res.redirect('/');
        }
        apiV1( 'GET', query, function (response) {
            res.json(response);
        });
    });

    app.get('*', function (req,res) {
        res.redirect('/');
    });

    app.post('/api/v1/', bodyParser, function (req, res) {
        if ( !req.body ) {
            res.json({
                status: 'error',
                response: 'No data to parse'
            });
        }
        apiV1( 'POST', req.body, function (response) {
            res.json(response);
        });
    });
};
4
Alexander Sasha Shcherbakov

После многих попыток я получил свое решение

Я прокомментировал эту строку

app.use(bodyParser.json());

и я положил

app.use(bodyParser.json({limit: '50mb'}))

Тогда работает

4
Maulik Patel

Для express ~ 4.16.0, express.json с лимитом работает напрямую

app.use(express.json({limit: '50mb'}));
3
Stenal P Jolly

Я использовал другую практику для этой проблемы с зависимостью.

Пример: 

multer = require('multer');

var uploading = multer({
  limits: {fileSize: 1000000, files:1},
});

exports.uploadpictureone = function(req, res) {
  cloudinary.uploader.upload(req.body.url, function(result) {
    res.send(result);
  });
};

module.exports = function(app) {
    app.route('/api/upload', uploading).all(uploadPolicy.isAllowed)
        .post(upload.uploadpictureone);
};
3
Quentin Malguy

Немного другой подход - полезная нагрузка слишком БОЛЬШАЯ

Пока что все полезные ответы касаются увеличения предела полезной нагрузки. Но может также случиться так, что полезная нагрузка действительно слишком велика, но без веской причины. Если нет никаких веских причин для этого, подумайте, почему это так раздуто.

Наш собственный опыт

Например, в нашем случае приложение Angular жадно отправляло весь объект в полезную нагрузку. Когда одно раздутое и избыточное свойство было удалено, размер полезной нагрузки уменьшился в 100 раз. Это значительно улучшило производительность и позволило устранить ошибку 413. 

3
Boaz

В моем случае проблема была в Конфигурация Nginx . Чтобы решить эту проблему, я должен отредактировать файл: /etc/nginx/nginx.conf и добавить эту строку внутри блока сервера:

client_max_body_size 5M;

Перезапустите Nginx и проблемы исчезли

Sudo systemctl restart nginx
2
Jaime Fernandez

Лучше использовать вы можете указать ограничение размера вашего файла, как показано в данной строке

app.use (bodyParser.json ({limit: '10mb', extended: true})) app.use (bodyParser.urlencoded ({limit: '10mb', extended: true}))

Вы также можете изменить настройку по умолчанию в body-parser узлов-модулей, затем в папке lib есть JSON и текстовый файл. Тогда измените лимит здесь. На самом деле, это условие выполняется, если вы не передаете параметр limit в заданной строке app.use (bodyParser.json ({limit: '10mb', extended: true})).

0
Ravi Beniwal

Для меня главный трюк 

app.use(bodyParser.json({
  limit: '20mb'
}));

app.use(bodyParser.urlencoded({
  limit: '20mb',
  parameterLimit: 100000,
  extended: true 
}));

bodyParse.json first bodyParse.urlencoded второй

0
Nicollas Matheus