Помилка: запит об’єкта завеликий


470

Я отримую таку помилку з експресом:

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 я бачу заголовок довжини вмісту зі значенням: 1078702

Я вважаю, це в октетах, це 1,0777 мегабайт.

Я поняття не маю, чому express не дозволяє мені розміщувати масив json, який я розміщував раніше в іншому експрес-проекті, який не використовував середню структуру проекту стека.


5
швидко зверніть увагу на це для всіх, хто приходить до цього питання - переконайтеся, що ваша проблема - це власне сервер вузлів або аналізатор тіла. Наприклад, я правильно використовую аналізатор тіла, але я отримав цю помилку, оскільки я встановив максимальний розмір тіла у файлі конфіденційності NGINX.
Стівен Тетро

@StephenTetreault Я думаю, ви повинні додати, що як відповідь, хоча, звичайно, це не стосуватиметься всіх, саме зі мною було, кудо.
Дадо

Відповіді:


991

Нещодавно у мене була та сама помилка, і всі знайдені нами рішення не працювали.

Після деякого копання я виявив, що налаштування 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скидає граничний параметр і ігнорує те, що ми вказали. Я спробував окремо вказати 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 буде встановлений у Connect 3.0 та не повинен застосовуватися. Натомість слід оголосити парсери прямо, так:

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

Якщо вам потрібна багатопартійна (для завантаження файлів), дивіться цю публікацію .

[друга редакція]

Зауважте, що в Express 4 замість express.json()і express.urlencoded()вам потрібно вимагати модуль аналізатора тіла та використовувати його 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
Моя проблема полягала в тому, що я мав parser express.json () над моїм bodyParser ... Після того, як зрозумів, як це все працює, я видалив bodyParser і встановив де обмеження в іншому, як app.use(express.json({limit:'50mb'}));. Я відредагував свою відповідь, щоб це відобразити!
Самуель Болдук

2
для експресу 4 вказаний код кидає "невизначений розширений параметр body-parser: надано розширений варіант" під час urlencodedвиклику
Майк 'Pomax' Kamermans

3
Дякуємо за оновлення цього експресу 4. Ви рятувальник життя!
Запливає

36
Це так само вичерпно, як отримує ця відповідь, тому є ще одна точка для подальшого посилання, на яку я зіткнувся, якщо ви використовуєте nginx як зворотний проксі перед вашим екземпляром node.js / express, що також рекомендується. Nginx викине той самий 413::Request Entity is too largeвиняток. Він не пересилає запит у ваш експрес-додаток. Тому нам потрібно встановити client_max_body_size 50M;в nginx config АБО конкретну конфігурацію сервера АБО навіть конкретний тег локації буде працювати.
Авхан

3
Дякую Самуелю за це! Врятував мене від світу головного болю, ура та +1 за вичерпну відповідь!
BastianBuhrkall

117

Я використовую Express 4.

У моєму випадку було недостатньо додати наступні рядки:

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

Я спробував додати параметр параметраLimit у функції urlencoded, оскільки документація говорить, і помилка більше не з’являється.

ПараметрLimit керує максимальною кількістю параметрів, дозволених у кодованих URL-адресою даних. Якщо запит містить більше параметрів, ніж це значення, 413 буде повернуто клієнту. За замовчуванням до 1000.

Спробуйте з цим кодом:

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

ПараметрLimit був черговим дискомфортом, який мені не вистачало, дякую, що вказав на це.
кровеберд

1
Додавання "параметраLimit: 50000" вирішує проблему.
Андрієн Печсон

1
Я так важко боровся з цим, поки не знайшов цієї відповіді. ДЯКУЮ ТОБІ! #Relieve
Стефан Селіс

Це саме те, що я шукав!
ApplePie

Я боровся з помітним рішенням, але це дуже допомагає.
Ахмед Хан

55

Якщо хтось спробував усі відповіді, але ще не мав успіху і використовує NGINX для розміщення сайту, додайте цю лінію до / etc / nginx / available-sites

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 ... знову велике спасибі
Fadi Abo Msalam

Як встановити ліміт лише у експресі?
alex dykyі

@ alexdykyі Відповідь від 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 / люди /', express.bodyParser ({ліміт: '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 корисної навантаження ). Вирішувалося лише (не потрібно встановлювати жодних s). parameterLimitlimit
aesede

13

2016 рік, жодне з перерахованого вище не працювало для мене, поки я explicity не встановив 'type' на додаток до 'limit' для 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);

Так, це теж потрібно було зробити. І він був налаштований так, що ви можете керувати налаштуваннями конфігурації зі свого сценарію програми.
Робд Садлер

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

визначається лише перший, app.use(bodyParser());а два останні рядки ігноруються.

Посилайтесь: https://github.com/expressjs/body-parser/isissue/176 >> див. "Dougwilson коментував 17 червня 2016 року"


1
ДЯКУЮ ТОБІ! У мене також був старий app.use (bodyParser.json ()); в моєму коді раніше і справді береться лише перша!
Ніко

8

Для Express ~ 4.16.0 Express.json з лімітом працює безпосередньо

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

6

У моєму випадку проблема була в конфігурації 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

Маленька стара посада, але у мене була така ж проблема

Використовуючи експрес 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'}))

Тоді це працює



2

Для кращого використання ви можете вказати ліміт розміру вашого файлу, як це відображено в заданих рядках:

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

Ви також можете змінити налаштування за замовчуванням у вузлах-модулях bodyserser, потім у папці lib, є JSON та текстовий файл. Потім змініть ліміт тут. Насправді ця умова проходить, якщо ви не передаєте граничний параметр у заданому рядку app.use (bodyParser.json ({limit: '10mb', розширено: true})).


1

Я теж стикався з цим питанням, я робив дурну помилку, повторюючи app.use(bodyParser.json())подібне нижче:

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

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


1

У моєму випадку видалення Content-typeіз заголовка запиту спрацювало.


0

Для мене головна хитрість

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

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

bodyParse.json перший bodyParse.urlencoded другий


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.