Ошибка: объект запроса слишком велик
Я получаю следующую ошибку с экспресс:
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, который не использовал структуру проекта среднего стека.
31 ответ
Недавно у меня была та же ошибка, и все решения, которые я нашел, не работали.
После некоторых копаний я нашел эту настройку 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'}));
В случае, если вам нужно несколько частей (для загрузки файлов), смотрите этот пост.
Второе редактирование
Обратите внимание, что в 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
). Это связано с тем, что эта опция потребуется в следующей версии и больше не будет обязательной. Для получения дополнительной информации о extended
вариант, пожалуйста, обратитесь к readme из body-parser
,
Я использую 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}));
Если кто-то попробовал все ответы, но пока не добился успеха и использует NGINX для размещения сайта, добавьте эту строку в /etc/nginx/sites-available
client_max_body_size 100M; #100mb
Я не думаю, что это явный глобальный лимит размера, а именно ограничение промежуточного программного обеспечения connect.json. Это 100 КБ по умолчанию при использовании express.bodyParser()
и не предоставлять limit
вариант.
Пытаться:
app.post('/api/0.1/people', express.bodyParser({limit: '5mb'}), yourHandler);
Для express ~4.16.0, express.json с лимитом работает напрямую
app.use(express.json({limit: '50mb'}));
В моем случае.. настройка parameterLimit:50000
исправил проблему
app.use( bodyParser.json({limit: '50mb'}) );
app.use(bodyParser.urlencoded({
limit: '50mb',
extended: true,
parameterLimit:50000
}));
Следующее сработало для меня... Просто используйте
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 г."
Приведенная ниже настройка сработала для меня
Экспресс 4.16.1
app.use(bodyParser.json({ limit: '50mb' }))
app.use(bodyParser.urlencoded({
limit: '50mb',
extended: false,
}))
Nginx
client_max_body_size 50m
client_body_temp_path /data/temp
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);
В моем случае проблема была в конфигурации Nginx. Чтобы решить это, я должен отредактировать файл: /etc/nginx/nginx.conf
и добавьте эту строку внутри блока сервера:
client_max_body_size 5M;
Перезапустите Nginx и проблемы исчезли
sudo systemctl restart nginx
Эта проблема возникает в двух случаях:
1- тело запроса слишком велико, и сервер не может обработать эти большие данные. это послужит этому
app.use(express.json({limit: '50mb'}));
2-req.cookies
слишком велик. При тестировании разных приложений next.js в одном и том же браузере каждый раз каждое приложение запускалось на другом порту, если были запущены какие-то приложения. Одно и то же приложение может начинаться с диапазона портов 3000–3005. Это означает, что если ваше приложение сохраняет файл cookie, этот файл cookie будет сохранен для каждого порта. Допустим, вы запустили 5 разных приложений на локальном хосте:3000, и каждое из них сохранило файл cookie. Если вы сделаете запрос, все куки будут прикреплены к объекту запроса, в этом случае вы не сможете обработать даже небольшой размерpost.body
. Решение: вам нужно удалить все файлы cookie
Немного другой подход - полезная нагрузка слишком БОЛЬШАЯ
Пока что все полезные ответы касаются увеличения предела полезной нагрузки. Но может также случиться так, что полезная нагрузка действительно слишком велика, но без веской причины. Если нет веской причины для этого, подумайте, почему это так раздуто.
Наш собственный опыт
Например, в нашем случае приложение Angular жадно отправляло весь объект в полезную нагрузку. Когда одно раздутое и избыточное свойство было удалено, размер полезной нагрузки уменьшился в 100 раз. Это значительно улучшило производительность и позволило устранить ошибку 413.
Просто добавление этой строки должно решить ее на самом деле
app.use(express.json({limit: '50mb'}));
Также рекомендуем вам, ребята, отправить все изображение на серверную часть, а затем преобразовать его, а не отправлять данные из внешнего интерфейса.
После стольких попыток я получил свое решение
Я прокомментировал эту строку app.use(bodyParser.json());
и я положил app.use(bodyParser.json({limit: '50mb'}))
Чем это работает
Передайте приведенные ниже конфигурации на свой сервер, чтобы увеличить размер запроса.
app.use(express.json({ extended: false, limit: '50mb' }))
app.use(express.urlencoded({ limit: '50mb', extended: false, parameterLimit: 50000 }))
В моем случае удаление Content-type
из заголовков запросов сработало.
Чтобы добавить к ответу Александра .
По умолчанию NGINX имеет ограничение на загрузку 1 МБ на файл. Ограничивая размер загружаемых файлов, вы можете предотвратить некоторые типы атак типа «отказ в обслуживании» (DOS) и многие другие проблемы.
Таким образом, когда вы пытаетесь загрузить файл размером более 1 МБ, вы столкнетесь с ошибкой 4 13.
Редактируя client_max_body_size, вы можете настроить размер загружаемого файла. Использоватьhttp
,server
, илиlocation
заблокировать для редактированияclient_max_body_size
.
server {
server_name example.com;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
client_max_body_size 20M;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/infohob.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/infohob.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
Маленький старый пост, но у меня была такая же проблема
При использовании 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);
});
});
};
Если вы используете 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 }));
Я использовал другую практику для этой проблемы с зависимостью.
Пример:
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);
};
Попробовав все, что описано в этом посте, я потерпел неудачу. Но я нашел решение, которое сработало для меня. Мне удалось решить эту проблему без использования body-parser и только с помощью экспресса . Выглядело это так:
const express = require('express');
const app = express();
app.use(express.json({limit: '25mb'}));
app.use(express.urlencoded({limit: '25mb', extended: true}));
Не забудьте использовать extended: true, чтобы удалить устаревшее сообщение с консоли.
Работа для меня:
Максимальный размер файла конфигурации nginx [https://patriciahillebrandt.com/nginx-413-request-entity-too-large/][1]
а также
app.use(bodyParser.json({ limit: "200mb" }));
app.use(bodyParser.urlencoded({ limit: "200mb", extended: true, parameterLimit: 1000000 }));
Для меня следующий фрагмент решил проблему.
var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'}));
Я тоже столкнулся с этой проблемой, я делал глупую ошибку, повторяя app.use(bodyParser.json())
как ниже:
app.use(bodyParser.json())
app.use(bodyParser.json({ limit: '50mb' }))
удалив app.use(bodyParser.json())
, решил проблему.
Недавно я столкнулся с той же проблемой, и для меня работает следующее решение.
Dependency : express >> version : 4.17.1 body-parser >> version": 1.19.0
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
Для понимания:HTTP 431
Код состояния ответа HTTP 413 Payload Too Large указывает, что объект запроса превышает пределы, определенные сервером; сервер может закрыть соединение или вернуть поле заголовка Retry-After.
Лучше использовать вы можете указать ограничение размера вашего файла, как показано в данной строке
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})).
Следующий код решил мою проблему:
var bodyParser = require('body-parser');
var urlencodedParser = bodyParser.urlencoded({ extended: false, limit: '5mb' });
Для меня главный трюк
app.use(bodyParser.json({
limit: '20mb'
}));
app.use(bodyParser.urlencoded({
limit: '20mb',
parameterLimit: 100000,
extended: true
}));
bodyParse.json first bodyParse.urlencoded второй
Я использую multer для загрузки файлов в AWS s3. Для меня после добавления
client_max_body_size 100M;
в файл nginx, я получаю ошибку 400. (но ошибка 413 ушла, значит успешно прошла nginx и дошла до вашего сервера)
Решение ниже: /questions/54523763/oshibka-zagruzki-nodejs-multer-nginx-neozhidannyij-token-v-json-v-pozitsii-0/61788105#61788105
Мой файл app.js не нужно было менять, и он остался таким, который работает:
const express = require('express');
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));