it-swarm.com.de

Fehler: Anforderungsentität zu groß

Ich erhalte folgende Fehlermeldung mit express:

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

Ich benutze Meinen Stapel. Ich habe die folgenden Gebrauchsanweisungen in meinen express.js

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

Innerhalb von Fiddler kann ich den Inhaltslängenheader mit dem Wert 1078702 sehen

Ich glaube, das ist in Oktetten, das sind 1.0787 Megabytes.

Ich habe keine Ahnung, warum Express es nicht zulässt, das json-Array zu posten, das ich zuvor in einem anderen Express-Projekt gepostet hatte, das nicht die mittlere Stapelprojektstruktur verwendete.

348
mike james

Ich hatte kürzlich denselben Fehler und alle Lösungen, die ich gefunden habe, haben nicht funktioniert.

Nach einigem Graben stellte ich fest, dass die Einstellung app.use(express.bodyParser({limit: '50mb'})); den Grenzwert richtig festlegte. 

Wenn Sie eine console.log('Limit file size: '+limit); in node_modules/express/node_modules/connect/lib/middleware/json.js:46 hinzufügen und einen Knoten neu starten, erhalte ich diese Ausgabe in der Konsole: 

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

Wir können sehen, dass der Grenzwert beim Laden des Moduls connect auf 1 MB (1048576 Byte) gesetzt ist. Wenn ich dann das Limit setze, wird der console.log erneut aufgerufen, und diesmal ist das Limit 52428800 (50mb). Ich bekomme jedoch immer noch einen 413 Request entity too large.

Dann fügte ich console.log('Limit file size: '+limit); in node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10 hinzu und sah eine weitere Zeile in der Konsole, als die Route mit einer großen Aufforderung (vor der Fehlerausgabe) aufgerufen wurde: 

Limit file size: 1048576

Dies bedeutet, dass connect irgendwo irgendwo den Grenzparameter zurücksetzt und die von uns angegebenen Werte ignoriert. Ich habe versucht, die bodyParser-Parameter in der Routendefinition einzeln anzugeben, aber auch kein Glück.

Ich habe zwar keine geeignete Methode gefunden, um es dauerhaft festzulegen, "patch" kann es jedoch direkt im Modul "_". Wenn Sie Express 3.4.4 verwenden, fügen Sie dies in Zeile 46 von node_modules/express/node_modules/connect/lib/middleware/json.js hinzu:

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

Die Zeilennummer kann sich unterscheiden, wenn Sie nicht dieselbe Version von Express ausführen. __ Beachten Sie, dass dies bad ist und überschrieben wird, wenn Sie Ihr Modul aktualisieren.

Diese temporäre Lösung funktioniert also vorerst, aber sobald eine Lösung gefunden wird (oder das Modul behoben wurde, falls es sich um ein Modulproblem handelt), sollten Sie Ihren Code entsprechend aktualisieren.

Ich habe eine Ausgabe zu ihrem Github zu diesem Problem geöffnet.

[edit - Lösung gefunden]

Nach einigen Recherchen und Tests habe ich festgestellt, dass ich beim Debuggen app.use(express.bodyParser({limit: '50mb'})); hinzugefügt habe, aber afterapp.use(express.json());. Express würde dann das globale Limit auf 1 MB setzen, da der erste Parser, auf den er beim Ausführen des Skripts gestoßen war, express.json() war. Bewegen Sie bodyParser darüber den Trick.

Allerdings ist die bodyParser()-Methode in Connect 3.0 veraltet und sollte nicht verwendet werden. Stattdessen sollten Sie Ihre Parser explizit wie folgt deklarieren:

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

Falls Sie Multipart (für Dateiuploads) benötigen, lesen Sie diesen Beitrag .

Zweite Bearbeitung

Beachten Sie, dass Sie in Express 4 anstelle von express.json() und express.urlencoded() das Modul body-parser benötigen und seine Methoden json() und urlencoded() wie folgt verwenden:

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

Wenn die Option extended nicht explizit für bodyParser.urlencoded() definiert ist, wird eine Warnung (body-parser deprecated undefined extended: provide extended option) ausgegeben. Dies liegt daran, dass diese Option in der nächsten Version erforderlich ist und nicht mehr optional ist. Weitere Informationen zur Option extended finden Sie in der readme von body-parser.

769
Samuel Bolduc

Ich benutze Express 4.

In meinem Fall reichte es nicht aus, diese Zeilen hinzuzufügen:

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

Ich habe versucht, die parameterLimit-Option für die urlencoded-Funktion hinzuzufügen, wie in der Dokumentation angegeben und der Fehler nicht mehr angezeigt wird.

Die parameterLimit-Option steuert die maximale Anzahl von Parametern die in den URL-kodierten Daten zulässig sind. Wenn eine Anfrage mehr .__ enthält. Wenn der Parameter diesen Wert überschreitet, wird ein 413 an den Client zurückgegeben. Standardeinstellung ist 1000.

Versuchen Sie es mit diesem Code:

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

Wenn jemand alle Antworten ausprobiert hat, aber noch keinen Erfolg hatte und NGINX zum Hosten der Site verwendet, fügen Sie diese Zeile in/etc/nginx/sites-available hinzu

client_max_body_size 100M; #100mb
34
Alexander

Ich denke nicht, dass dies die ausdrückliche globale Größenbegrenzung ist, sondern speziell die connect.json-Middleware-Begrenzung . Dies ist standardmäßig 100 KB, wenn Sie express.bodyParser() verwenden und keine limit-Option angeben.

Versuchen:

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

in meinem Fall .. Einstellung parameterLimit:50000 hat das Problem behoben

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

2016 funktionierte keiner der oben genannten Punkte für mich, bis ich den Typ zusätzlich zum Limit für den Bodyparser explizit gesetzt habe. Beispiel:

  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

Folgendes funktionierte für mich ... einfach verwenden 

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

das ist es.

Versuchte alles oben und keiner hat funktioniert. Gefunden, dass, obwohl wir wie folgt verwenden,

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

nur die erste app.use(bodyParser()); wird definiert und die letzten beiden Zeilen wurden ignoriert.

Siehe: https://github.com/expressjs/body-parser/issues/176 >> siehe 'dougwilson kommentiert am Jun 17, 2016'

7
Vivek22

Kleiner alter Beitrag, aber ich hatte das gleiche Problem

Mit Express 4. + Sieht mein Code so aus und funktioniert nach zwei Tagen intensiven Tests.

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

Nach vielen Versuchen bekam ich meine Lösung

Ich habe diese Zeile kommentiert

app.use(bodyParser.json());

und ich stelle

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

Dann klappt es

4
Maulik Patel

Bei express ~ 4.16.0 funktioniert express.json mit limit direkt

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

Ich habe eine andere Praxis für dieses Problem mit Multer Dependance verwendet.

Beispiel: 

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

Ein etwas anderer Ansatz - die Nutzlast ist zu groß

Alle hilfreichen Antworten beziehen sich bisher auf die Erhöhung der Nutzlastgrenze. Es könnte aber auch der Fall sein, dass die Nutzlast zwar zu groß ist, aber ohne guten Grund. Wenn es keinen triftigen Grund dafür gibt, überlegen Sie, warum es überhaupt so aufgebläht ist.

Unsere eigene Erfahrung

In unserem Fall hat eine Angular-App beispielsweise gierig ein gesamtes Objekt in der Nutzlast gesendet. Wenn eine aufgeblähte und redundante Eigenschaft entfernt wurde, wurde die Payload-Größe wurde um den Faktor 100 reduziert. Dadurch wurde die Leistung erheblich verbessert und der Fehler 413 behoben. 

3
Boaz

In meinem Fall lag das Problem an der Nginx-Konfiguration . Um es zu lösen, muss ich die Datei bearbeiten: /etc/nginx/nginx.conf und diese Zeile im Serverblock hinzufügen:

client_max_body_size 5M;

Starten Sie Nginx neu und die Probleme sind verschwunden

Sudo systemctl restart nginx
2
Jaime Fernandez

für mich gelöst folgenden Schnipsel das Problem.

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

Auch ich war mit diesem Problem konfrontiert und habe einen dummen Fehler gemacht, indem ich app.use(bodyParser.json()) wie folgt wiederholt habe:

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

durch Entfernen von app.use(bodyParser.json()) wurde das Problem behoben.

0
WasiF

Zur besseren Verwendung können Sie das Limit Ihrer Dateigröße angeben, wie es in der angegebenen Zeile angezeigt wird

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

Sie können die Standardeinstellung auch im body-parser von node-modules ändern. Im lib-Ordner befinden sich dann JSON und eine Textdatei. Dann ändere hier das Limit. Diese Bedingung besteht tatsächlich, wenn Sie den Parameter limit in der angegebenen Zeile app.use (bodyParser.json ({limit: '10mb', extended: true}) nicht übergeben.

0
Ravi Beniwal

Für mich ist der Haupttrick 

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

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

bodyParse.json erster bodyParse.urlencoded zweiter

0