mike james
mike james

Reputation: 9430

Error: request entity too large

I'm receiving the following error with 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

I am using meanstack. I have the following use statements in my express.js

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

Within fiddler I can see the content-length header with a value of: 1078702

I believe this is in octets, this is 1.0787 megabytes.

I have no idea why express is not letting me post the json array I was posting previously in another express project that was not using the mean stack project structure.

Upvotes: 829

Views: 810206

Answers (30)

Victor
Victor

Reputation: 1003

For anyone getting this error only in Kubernetes (but not locally), you need to add this annotation in the metadata field of the ingress resource:

nginx.ingress.kubernetes.io/proxy-body-size: "0"

"0" means no limit, but you can also specify a fixed limit. Full example:

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "100m"

Upvotes: 0

İbrahim
İbrahim

Reputation: 130

If you are use cloudflare, they have a upload file size plans. Here are the upload limits per plan:

  • 100MB Free and Pro
  • 200MB Business
  • 500MB Enterprise

Upvotes: 0

Mendas
Mendas

Reputation: 41

if you still struggeling look for all your app.use(express.json()) in ALL your code and make sure is executed only once.

Upvotes: 1

Samuel Bolduc
Samuel Bolduc

Reputation: 19173

I had the same error recently, and all the solutions I tried did not work.

After some digging, I found that setting app.use(express.bodyParser({limit: '50mb'})); did set the limit correctly.

When adding a console.log('Limit file size: ' + limit); in node_modules/express/node_modules/connect/lib/middleware/json.js:46 and restarting node, I get this output in the console:

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

We can see that at first, when loading the connect module, the limit is set to 1mb (1048576 bytes). Then when I set the limit, the console.log is called again and this time the limit is 52428800 (50mb). However, I still get a 413 Request entity too large.

Then I added console.log('Limit file size: '+limit); in node_modules/express/node_modules/connect/node_modules/raw-body/index.js:10 and saw another line in the console when calling the route with a big request (before the error output) :

Limit file size: 1048576

This means that somehow, somewhere, connect resets the limit parameter and ignores what I specified. I tried specifying the bodyParser parameters in the route definition individually, but no luck either.

While I did not find any proper way to set it permanently, you can "patch" it in the module directly. If you are using Express 3.4.4, add this at line 46 of node_modules/express/node_modules/connect/lib/middleware/json.js :

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

The line number might differ if you don't run the same version of Express. Please note that this is bad practice and it will be overwritten if you update your module.

So this temporary solution works for now, but as soon as a solution is found (or the module fixed, in case it's a module problem) you should update your code accordingly.

I have opened an issue on their GitHub about this problem.

[edit - found the solution]

After some research and testing, I found that when debugging, I added app.use(express.bodyParser({limit: '50mb'}));, but after app.use(express.json());. Express would then set the global limit to 1mb because the first parser he encountered when running the script was express.json(). Moving bodyParser above it did the trick.

That said, the bodyParser() method will be deprecated in Connect 3.0 and should not be used. Instead, you should declare your parsers explicitly, like so :

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

In case you need multipart (for file uploads) see this post.

[second edit]

Note that in Express 4, instead of express.json() and express.urlencoded(), you must require the body-parser module and use its json() and urlencoded() methods, like so:

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

If the extended option is not explicitly defined for bodyParser.urlencoded(), it will throw a warning (body-parser deprecated undefined extended: provide extended option). This is because this option will be required in the next version and will not be optional anymore. For more info on the extended option, you can refer to the readme of body-parser.

[third edit]

It seems that in Express v4.16.0 onwards, we can go back to the initial way of doing this (thanks to @GBMan for the tip):

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

Upvotes: 1604

Yilmaz
Yilmaz

Reputation: 49293

This issue happens in two cases:

1- request body is too large and server cannot process this large data. this will serve it

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

2- req.cookies is too large. When testing different next.js applications on the same browser, each time each app was starting on a different port if there were running some apps. Same app might end up starting at port 3000-3005 range. That means if your app saves cookie, that cookie will be saved for each port. Let's say you started 5 different apps at localhost:3000, and each one saved a cookie. If you make a request, all the cookies will be attached to the request object, in this case you will not able to process even small size of post.body. Solution is you have to delete all the cookies

enter image description here

Upvotes: 13

Akashgreninja
Akashgreninja

Reputation: 627

Just adding this one line must solve it actually

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

Also recommend you guys to send the whole image to the backend then convert it rather then sending the data from the frontend

Upvotes: 11

Promise Preston
Promise Preston

Reputation: 28900

To add to Alexander's answer.

By default, NGINX has an upload limit of 1 MB per file. By limiting the file size of uploads, you can prevent some types of Denial-of-service (DOS) attacks and many other issues.

So when you try to upload a file above the 1MB limit you will run into a 413 error.

By editing client_max_body_size, you can adjust the file upload size. Use the http, server, or location block to edit 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

}

Reference: Limit File Upload Size in NGINX

Upvotes: 6

Daniel Rodrigues
Daniel Rodrigues

Reputation: 143

Work for me:

Config nginx max file zise [https://patriciahillebrandt.com/nginx-413-request-entity-too-large/][1]

and

app.use(bodyParser.json({ limit: "200mb" }));
app.use(bodyParser.urlencoded({ limit: "200mb",  extended: true, parameterLimit: 1000000 }));

Upvotes: 5

shellyyg
shellyyg

Reputation: 111

I am using multer to upload files to AWS s3. For me, after adding client_max_body_size 100M; into nginx file, I get 400 error. (but the 413 error is gone, this means that it successfully went through nginx and reach your server)

Solution is below: https://stackoverflow.com/a/71240419/15477963

My app.js file did not need to change, and remain like this, which works:

const express = require('express');
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

Upvotes: 0

ASANIAN
ASANIAN

Reputation: 400

Following code resolved my issue:

var bodyParser = require('body-parser');
var urlencodedParser = bodyParser.urlencoded({ extended: false, limit: '5mb' });

Upvotes: 1

Peter Lyons
Peter Lyons

Reputation: 146014

I don't think this is the express global size limit, but specifically the connect.json middleware limit. This is 1MB by default when you use express.bodyParser() and don't provide a limit option.

Try:

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

Upvotes: 45

Kent
Kent

Reputation: 439

The setting below has worked for me

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

Upvotes: 16

Manish
Manish

Reputation: 539

Pass the below configs to your server to increase your request size.

app.use(express.json({ extended: false, limit: '50mb' }))
app.use(express.urlencoded({ limit: '50mb', extended: false, parameterLimit: 50000 }))

Upvotes: 7

Boaz
Boaz

Reputation: 20230

A slightly different approach - the payload is too BIG

All the helpful answers so far deal with increasing the payload limit. But it might also be the case that the payload is indeed too big but for no good reason. If there's no valid reason for it to be, consider looking into why it's so bloated in the first place.

Our own experience

For example, in our case, an Angular app was greedily sending an entire object in the payload. When one bloated and redundant property was removed, the payload size was reduced by a factor of a 100. This significantly improved performance and resolved the 413 error.

Upvotes: 12

Samuel Fran&#231;a
Samuel Fran&#231;a

Reputation: 51

After trying everything in this post, i was unsuccessful. But I found a solution that worked for me. I was able to solve it without using the body-parser and only with the express. It looked like this:

const express = require('express');    

const app = express();
app.use(express.json({limit: '25mb'}));
app.use(express.urlencoded({limit: '25mb', extended: true}));

Don't forget to use extended: true to remove the deprecated message from the console.

Upvotes: 5

antelove
antelove

Reputation: 3348

Express 4.17.1

app.use( express.urlencoded( {
    extended: true,
    limit: '50mb'
} ) )

Demo csb

Upvotes: 1

Asraful
Asraful

Reputation: 1290

I faced the same issue recently and bellow solution workes for me.

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

For understanding : HTTP 431

The HTTP 413 Payload Too Large response status code indicates that the request entity is larger than limits defined by server; the server might close the connection or return a Retry-After header field.

Upvotes: 3

KEMBL
KEMBL

Reputation: 624

For those who start the NodeJS app in Azure under IIS, do not forget to modify web.config as explained here Azure App Service IIS "maxRequestLength" setting

Upvotes: 0

saeta
saeta

Reputation: 4238

In my case it was not enough to add these lines :

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

I tried adding the parameterLimit option on urlencoded function as the documentation says and error no longer appears.

The parameterLimit option controls the maximum number of parameters that are allowed in the URL-encoded data. If a request contains more parameters than this value, a 413 will be returned to the client. Defaults to 1000.

Try with this code:

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

Upvotes: 193

NIKIT PULEKAR
NIKIT PULEKAR

Reputation: 51

If you are using express.json() and bodyParser together it will give error as express sets its own limit.

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

remove above code and just add below code

app.use(bodyParser.json({ limit: "200mb" }));
app.use(bodyParser.urlencoded({ limit: "200mb",  extended: true, parameterLimit: 1000000 }));

Upvotes: 5

user1709076
user1709076

Reputation: 2846

2016, none of the above worked for me until i explicity set the 'type' in addition to the 'limit' for bodyparser, example:

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

Upvotes: 16

carkod
carkod

Reputation: 2230

In my case removing Content-type from the request headers worked.

Upvotes: 6

WasiF
WasiF

Reputation: 28857

I too faced that issue, I was making a silly mistake by repeating the app.use(bodyParser.json()) like below:

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

by removing app.use(bodyParser.json()), solved the problem.

Upvotes: 3

Sanjeeva Kumar Acham
Sanjeeva Kumar Acham

Reputation: 101

for me following snippet solved the problem.

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

Upvotes: 4

Ravi Beniwal
Ravi Beniwal

Reputation: 21

The better use you can specify the limit of your file size as it is shown in the given lines:

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

You can also change the default setting in node-modules body-parser then in the lib folder, there are JSON and text file. Then change limit here. Actually, this condition pass if you don't pass the limit parameter in the given line app.use(bodyParser.json({limit: '10mb', extended: true})).

Upvotes: 2

Nicollas
Nicollas

Reputation: 250

For me the main trick is

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

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

bodyParse.json first bodyParse.urlencoded second

Upvotes: 0

Maulik Patel
Maulik Patel

Reputation: 717

After דo many tries I got my solution

I have commented this line

app.use(bodyParser.json());

and I put

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

Then it works

Upvotes: 9

Stenal P Jolly
Stenal P Jolly

Reputation: 777

For express ~4.16.0, express.json with limit works directly

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

Upvotes: 40

Jaime Fernandez
Jaime Fernandez

Reputation: 920

In my case the problem was on Nginx configuration. To solve it I have to edit the file: /etc/nginx/nginx.conf and add this line inside server block:

client_max_body_size 5M;

Restart Nginx and the problems its gone

sudo systemctl restart nginx

Upvotes: 15

Alexander
Alexander

Reputation: 1612

If someone tried all the answers, but hadn't had any success yet and uses NGINX to host the site add this line to /etc/nginx/sites-available

client_max_body_size 100M; #100mb

Upvotes: 79

Related Questions