Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node.js Express express.json and express.urlencoded with form submit

Tags:

Express (or Connect's) bodyParser middleware is marked deprecated and users are advised to use instead:

app.use(connect.urlencoded()) app.use(connect.json())   

However, when I run the an example from Node.js in Action, I use curl to fill out the form as suggested by the book:

curl -F entry[title]='Ho ho ho' -F entry[body]='santa loves you' http://abc:[email protected]:3000/api/entry 

It doesn't work. req.body is not defined. Am I missing something? It works fine with bodyParser.

EDIT: SOLUTION as of Express 4

Parse json this way:

var bodyParser = require('body-parser');  ...  app.use(bodyParser.json()); 

Parse urlencoded body this way:

app.use(bodyParser.urlencoded({extended: true})); 

Then there is no deprecation warning. The extended: true (default) uses the qs module and false uses the querystring module to parse the body.

Don't use app.use(bodyParser()), that usage is now deprecated.

like image 725
huggie Avatar asked Mar 03 '14 09:03

huggie


People also ask

Can I use Express JSON and Express Urlencoded?

You NEED express. json() and express. urlencoded() for POST and PUT requests, because in both these requests you are sending data (in the form of some data object) to the server and you are asking the server to accept or store that data (object), which is enclosed in the body (i.e. req.

What are Express JSON () and Express Urlencoded ()?

So the difference is express. json() is a body parser for post request except html post form and express. urlencoded({extended: false}) is a body parser for html post form.

Why we use express JS?

Express provides methods to specify what function is called for a particular HTTP verb ( GET , POST , SET , etc.) and URL pattern ("Route"), and methods to specify what template ("view") engine is used, where template files are located, and what template to use to render a response.

Why we use body parser in node JS?

Body-parser is the Node. js body parsing middleware. It is responsible for parsing the incoming request bodies in a middleware before you handle it.


1 Answers

bodyParser is in fact the composition of three middlewares (see documentation and relevant source code): json, urlencoded and multipart:

  • json parses application/json request bodies
  • urlencoded parses x-ww-form-urlencoded request bodies
  • and multipart parses multipart/form-data request bodies, which is what you're interested in.

If you only specify json and urlencoded middlewares, the form data won't be parsed by any middleware, thus req.body won't be defined. You then need to add a middleware that is able to parse form data such as formidable, busboy or multiparty (as stated in connect's documentation).

Here is an example, using multiparty:

var multipart = require('connect-multiparty'); var multipartMiddleware = multipart(); app.use('/url/that/accepts/form-data', multipartMiddleware); app.post('/url/that/accepts/form-data', function(req, resp) {     console.log(req.body, req.files); }); 

Don't forget that by using such middlewares you allow anyone to upload files to your server: it then your responsibility to handle (and delete) those files.

like image 90
Paul Mougel Avatar answered Oct 07 '22 17:10

Paul Mougel