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

474

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

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, который не использовал структуру проекта среднего стека.

Майк Джеймс
источник
5
быстрое примечание по этому вопросу для всех, кто придет к этому вопросу - убедитесь, что ваша проблема на самом деле является сервером узлов или анализатором тела. Например, я правильно использую парсер тела, но я получил эту ошибку, потому что я настроил максимальный размер тела в файле конфигурации NGINX.
Стивен Тетро
@ StephhenTetreault Я думаю, вы должны добавить это в качестве ответа, хотя, конечно, это не относится ко всем, это было именно то, что со мной происходило, слава.
Дадо

Ответы:

996

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

После некоторых копаний я обнаружил, что настройка 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параметры в определении маршрута по отдельности, но тоже не повезло.

Хотя я не нашел подходящего способа установить его на постоянной основе, вы можете « исправить » его непосредственно в модуле. Если вы используете 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 об этой проблеме.

[редактировать - нашел решение]

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

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

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

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

[второе редактирование]

Обратите внимание, что в Express 4 вместо express.json()and 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). Это связано с тем, что эта опция потребуется в следующей версии и больше не будет обязательной. Для получения дополнительной информации по extendedвыбору, вы можете обратиться к риому из body-parser.

[третье редактирование]

Кажется, что в Express v4.16.0 мы можем вернуться к первоначальному способу сделать это (спасибо @GBMan за подсказку):

app.use(express.json({limit: '50mb'}));
app.use(express.urlencoded({limit: '50mb'}));
Сэмюэл Болдук
источник
7
Моя проблема была в том, что у меня был парсер express.json () над моим bodyParser ... Поняв, как все это работает, я удалил bodyParser и установил de limit в другом, например app.use(express.json({limit:'50mb'}));. Я отредактировал свой ответ, чтобы отразить это!
Самуэль Болдук
2
для экспресс-4 указанный код выдает « urlencodedвызов синтаксического анализатора тела не определен расширенный: предоставить расширенную опцию» в вызове
Майк 'Pomax' Kamermans
3
Спасибо за обновление этого для экспресс 4. Вы спасатель жизни!
Swills
36
Этот ответ настолько же исчерпывающий, насколько этот ответ получен, поэтому есть еще один момент для дальнейшего ознакомления, с которым я столкнулся, если вы используете nginx в качестве обратного прокси-сервера перед вашим экземпляром node.js / express, что также является рекомендуемой практикой. Nginx выдаст то же 413::Request Entity is too largeисключение. Он не будет пересылать запрос в ваше экспресс-приложение. Поэтому нам нужно установить client_max_body_size 50M;в конфигурации nginx ИЛИ конкретную конфигурацию сервера ИЛИ даже определенный тег местоположения будет работать.
Аухан
3
Спасибо, Самуэль, за это! Спас меня от головной боли, Приветствия и +1 за исчерпывающий ответ!
BastianBuhrkall
118

Я использую 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}));
slorenzo
источник
Параметр Limit был еще одной ошибкой, которую мне не хватало, спасибо за указание на это.
crowebird
1
Добавление «parameterLimit: 50000» решает проблему.
Андриен Пексон
1
Я так тяжело боролся с этим, пока не нашел ответ. БЛАГОДАРЮ ВАС! #Relieve
Стефан Селис
Это именно то, что я искал!
ApplePie
Я боролся с отмеченным решением, но это очень помогает.
Ахмед Хан
55

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

client_max_body_size 100M; #100mb
Александр
источник
4
Это была моя проблема, спасибо! Одна подсказка в том, что nginx по умолчанию равен 1 МБ, поэтому, если вы ограничены этой суммой, то, вероятно, это nginx. Кроме того , еще один ключ: body-parser будет возвращать в limitсобственность и lengthимущество в объекте ошибки (вместе с status:413). Nginx не делает этого. Так что, если вы не видите эти свойства в объекте ошибки, это, вероятно, предел nginx. Вот как изменить этот параметр nginx (файлы конфигурации, скорее всего, в /etc/nginx/sites-available/)
2
Огромное спасибо за этот ответ. Я считаю, что за этот ответ следует проголосовать, потому что это важно, лично я забыл о конфигурации nginx ... еще раз большое спасибо
Фади Або Мсалам,
Как установить лимит только в экспрессе?
Алекс Дыкиі
@ аlexdykyі Ответ от Vivek22: app.use (bodyParser ({limit: '50mb'}));
Александр
это была проблема! благодарю вас!
Виктор,
31

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

Пытаться:

app.post('/api/0.1/people', express.bodyParser({limit: '5mb'}), yourHandler);
Питер Лайонс
источник
1
Привет - я использую следующее: app.get ('/ api / 0.1 / people /', express.bodyParser ({limit: '100mb'}), track.all); Я все еще получаю ту же ошибку ...
Майк Джеймс
ограничение по умолчанию составляет 100 Кбайт, как кажется сейчас github.com/expressjs/body-parser#limit
Qiong Wu
15

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

app.use( bodyParser.json({limit: '50mb'}) );
app.use(bodyParser.urlencoded({
  limit: '50mb',
  extended: true,
  parameterLimit:50000
}));
Моханад Обейд
источник
Это сработало для меня. «Слишком большой объект запроса», по-видимому, также относится к большим строкам (например, JSON). Я отправлял ~ 20Kib JSON, и у меня возникла эта проблема (обратите внимание, что для меня допустимо ограничение размераbody-parser полезной нагрузки по умолчанию ). Была решена только с (не нужно устанавливать какие-либо с). parameterLimitlimit
июня
13

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-urlencoded' })

  app.use(jsonParser);
  app.use(urlencodedParser);
user1709076
источник
Да, это то, что мне нужно было сделать также. И это было настроено так, что вы можете управлять настройками конфигурации из вашего скрипта приложения.
Робб Садлер
3
Вы имели в виду application/x-www-form-urlencoded(а не application/x-www-form-urlencoding)?
граната
12

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

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 г.»

Vivek22
источник
1
БЛАГОДАРЮ ВАС! У меня также был старый app.use (bodyParser.json ()); в моем коде раньше и действительно, только первый взят!
Нико
9

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

app.use(express.json({limit: '50mb'}));
Stenal P Jolly
источник
7

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

client_max_body_size 5M;

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

sudo systemctl restart nginx
Хайме Фернандес
источник
5

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

Пример:

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);
};
Квентин Малгуй
источник
5

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

Используя Express 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

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

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

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

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

Вооз - восстановить Монику
источник
4

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

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

app.use(bodyParser.json());

и я положил

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

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

Маулик Патель
источник
3

для меня следующий фрагмент решил проблему.

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'})); 
Санджеева Кумар Ахам
источник
2

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

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

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

Рави Бенивал
источник
1

Я тоже столкнулся с этой проблемой, я сделал глупую ошибку, повторив app.use(bodyParser.json())следующее:

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

удалив app.use(bodyParser.json()), решил проблему.

Wasif
источник
1

В моем случае удаление Content-typeиз запроса заголовков сработало.

carkod
источник
0

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

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

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

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

Nicollas
источник
0

Если вы используете express.json()и bodyParser вместе, это выдаст ошибку, так как экспресс устанавливает свой собственный предел.

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

удалить код выше и просто добавить код ниже

app.use(bodyParser.json({ limit: "200mb" }));
app.use(bodyParser.urlencoded({ limit: "200mb",  extended: true, parameterLimit: 1000000 }));
НИКИТ ПУЛЕКАР
источник
спасибо за форматирование @ tomislav-stankovic
NIKIT PULEKAR