Ошибка: запрос слишком большой

Я получаю следующую ошибку с выражением:

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.0787 мегабайт.

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

Ответ 1

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

После некоторых app.use(express.bodyParser({limit: '50mb'})); я обнаружил, что настройка 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 об этой проблеме.

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

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

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

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

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

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

Обратите внимание, что в 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.

Ответ 2

Я использую 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}));

Ответ 3

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

client_max_body_size 100M; #100mb

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

Используя экспресс 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);
        });
    });
};

Ответ 10

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

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

app.use(bodyParser.json());

и я положил

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

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

Ответ 11

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

client_max_body_size 5M;

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

sudo systemctl restart nginx

Ответ 12

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

Пример:

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

Ответ 13

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

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

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

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

Ответ 14

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

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

Ответ 15

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

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})).

Ответ 16

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

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

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

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

Ответ 17

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

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

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

Ответ 18

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