Request Entity Too Large - node.js

My Express application is returning "Request Entity Too Large" on a file upload of only a 125kb PNG file.
I have configured the body parser middleware as such:
app.use(bodyParser.urlencoded({
limit: '5mb',
type:'*/x-www-form-urlencoded',
extended: true
}));
according to the documentation. No matter how high I set the limit, or what combination of options, I always get the same result. I am using Express 4.13.3 and body-parser 1.15.2.
What am I doing wrong?

Embarrassingly, I had accidentally pointed my route handler to the wrong Express Router instance. Once I was pointed to the correct handler, Multer picked up the multi-part POST correctly.
Interestingly, when testing with Postman, it will send an array of files, even if you only select one, which is why request.file was undefined, but request.files contained the correct value.

Related

Getting 413 error when trying to receive base64 images

I am trying to create a web service that receives data from our school database. The connection service works fine until I try to receive the photos from the datasource.
The images come in as a base64 and I am using the following code to control the post_size:
app.use(express.json({limit: "2000mb"}));
app.use(express.urlencoded({limit: "2000mb", extended: false}));
This is the largest size I have used, just to make sure that data of any size can come in. This is only for testing and once I know the actual size I can adjust it accordingly.
So I have about 700 images that need to come in that are about 1MB each in size - so the 2000mb should be more than enough.
I keep getting the following message in the datasource's logs:
Error: 413 (Request Entity Too Large)
Is there a limit of expressjs, node or JSON that I am not aware off?
Would it be better to write this is PHP and use XML as the accepting format?
I would like to stick with Express and JSON if I can...
Thanks :-)
EDIT: I forgot to mention that I am running all this inside a docker container - maybe the limit is there?
I know this works for me. Use bodyParser instead. It looks like express.json and urlencoded may be deprecated.
const bodyParser = require('body-parser')
app.use(bodyParser.json({ limit: '50mb' }))
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }))
app.use(basePath + '/', routes)

multipart/form-data returns empty object | Nodejs

Form with POST method and enctype="multipart/form-data" returns empty object in Nodejs Express.
In app.js I have used:
const app = express()
app.use(express.urlencoded({ extended: true }))
app.use(express.json())
While using only POST type and action in the <form> tag
req.body gives output in json smoothly and have no issues.
But using enctype="multipart/form-data" in express req.body returns { } - empty object
Can anyone help with this?
The urlencoded middleware only handles the application/x-www-form-urlencoded content type and json handles the application/json content type. If you specifically need to use multipart/form-data (e.g. if you need to handle file uploads), you'll need a package for that, since as of writing, express doesn't come with a multipart parser out of the box. Common packages used to handle multipart are multer and formidable.
Alternatively, if you don't need to upload files or other binary content, just remove the enctype attribute as <form> defaults to application/x-www-form-urlencoded.
incase your using multer, its possible that your calling the upload method last, please call the upload that checks for image and then the other data from the form can later be submitted
i will give an example of my route
router.post('/add-product',productController.isUserAllowed,upload.single('avatar'), productController.add_product);
so initally i was calling productController.add_product beforeupload.single('avatar'), and it didnt work, till i started with the upload that checked the image , then the add_product

Body parsers behaving weirdly

I am trying to develop an app with few APIs, the issue I am facing here is when I use
app.use(bodyParser.urlencoded({ extended: false }));
as my middleware, it doesnt intake the requests i send through postman (all the request sent through postman goes with empty body idk why. And it takes all the requests sent via html form.
On the other hand, if I use
app.use(express.json({extended: false}))
as my middleware to parse json objects, it takes all the requests from postman but doesnt take requests from my browser form. Can anyone explain whats happening here?
In order for express to be able to parse both JSON request payloads and simple form-data requests, you simply need to setup both of the mentioned middlewares (note that express.json() does not have an extended option):
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.json());
See the docs for more information:
https://expressjs.com/en/api.html#express.json
https://expressjs.com/en/api.html#express.urlencoded

Getting error PayloadTooLargeError: request entity too large in case of Using express.Router() Post call

I am trying to POST call using Router through express but I am getting request entity too large error, can anyone please help to solve the issue?
I want to set mb limit to my POST call payload. I have tried app.use() limit setting through body-parser but seems to get the same issue.
Thanks
The default request size is 100kb in body-parser. try this
app.use(bodyParser.json({limit: '5mb'}));
app.use(bodyParser.urlencoded({limit: '5mb', extended: true}));
make sure to add this before defining the routes
For total noobs like me be sure to either just use bodyParser.json or express.json
I had both of these in my code and so no amount of changing body parser helped because it was using express.json to handle requests.
app.use(express.json());
const bodyParser = require('body-parser');
app.use(bodyParser.json());
there is a larger thread for this over on the other link.
Error: request entity too large

Can't POST (and parse) params to app.post() in express.js

I checked this question but for some reasons the solution given is not working for me. In my express.js I have:
...
bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
...
Run test using POSTman
app.post('/upload', function(req, res) {
console.log(req.body) // undefined
console.log(req.params) // undefined
})
and the result:
So both body & params are empty. Any suggestions?
The reason the solution in the link you provided doesn't work is because that version of body-parser is out of date and doesn't include form-data parsing anymore (and it used to be bundled with express).
With that being said, based on your screenshot, it looks like you are sending data of type multipart/form-data(you can check this in the request headers) to your server and your code sample only shows middleware that handles urlencoded and json data types.
You need to add middleware that handles that data type. The latest body parser says (https://github.com/expressjs/body-parser):
This does not handle multipart bodies, due to their complex and
typically large nature. For multipart bodies, you may be interested in
the following modules:
busboy and connect-busboy
multiparty and connect-multiparty
formidable
multer
So check out one of the above parsers. I use busboy and it works great.

Resources