express.urlencoded() Middleware in Express.js
express.urlencoded()
Middleware in Express.js
The express.urlencoded()
middleware is a built-in middleware function in Express.js that parses incoming requests with URL-encoded payloads. URL-encoded data is typically used when submitting HTML form data using the POST
method. The parsed data is available on the req.body
object.
Purpose of express.urlencoded()
- Parses URL-encoded Request Bodies: This middleware parses incoming requests with data encoded as application/x-www-form-urlencoded. This format is commonly used by web forms.
- Makes Data Available on
req.body
: After parsing, the form data is available as key-value pairs in thereq.body
object.
URL-Encoded Data Format
URL-encoded data is a key-value pair format, where data is encoded as part of the URL query string (but in the body of the request for POST requests). For example, an HTML form with fields for name
and age
might send data in this format:
name=John&age=30
This data would be parsed by the express.urlencoded()
middleware and made accessible as:
req.body = { name: 'John', age: '30' }
Syntax
app.use(express.urlencoded({ extended: true }));
The extended
Option
The extended
option determines how the URL-encoded data is parsed:
extended: false
: This uses the querystring library to parse URL-encoded data, which only supports simple key-value pairs (e.g.,name=John
).extended: true
: This uses the qs library, which allows for rich objects and arrays to be encoded into the URL-encoded format (e.g.,user[name]=John&user[age]=30
).
In most cases, you should use extended: true
unless you have a specific reason to use the false
option.
Example of express.urlencoded()
Here’s an example that demonstrates the use of the express.urlencoded()
middleware to handle form data sent via POST:
const express = require('express');
const app = express();
// Apply the express.urlencoded() middleware to parse URL-encoded request bodies
app.use(express.urlencoded({ extended: true }));
// Define a route to handle a form submission
app.post('/submit', (req, res) => {
const formData = req.body; // Access the parsed form data
res.send(`Received form data: ${JSON.stringify(formData)}`);
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
In this example:
- The
express.urlencoded({ extended: true })
middleware is used to parse the form data. - When a user submits a form to the
/submit
route, the form data is parsed and available inreq.body
.
Handling a Form Submission
Suppose you have an HTML form like this:
<form action="/submit" method="POST">
<label for="name">Name:</label>
<input type="text" id="name" name="name">
<label for="age">Age:</label>
<input type="text" id="age" name="age">
<button type="submit">Submit</button>
</form>
When the user submits the form, the data sent will be URL-encoded and look like this:
name=John&age=30
The express.urlencoded()
middleware will parse this data, and you can access it in req.body
like so:
{
name: 'John',
age: '30'
}
The extended: true
Example (Nested Objects)
If you set extended: true
, you can handle more complex form data, such as nested objects or arrays.
For example, if you have a form like this:
<form action="/submit" method="POST">
<label for="firstName">First Name:</label>
<input type="text" id="firstName" name="user[firstName]">
<label for="lastName">Last Name:</label>
<input type="text" id="lastName" name="user[lastName]">
<button type="submit">Submit</button>
</form>
The data sent will be:
user[firstName]=John&user[lastName]=Doe
With extended: true
, the data will be parsed into a nested object:
req.body = {
user: {
firstName: 'John',
lastName: 'Doe'
}
};
When to Use express.urlencoded()
You should use express.urlencoded()
middleware when:
- You expect to receive form data from HTML forms (which is usually URL-encoded).
- You need to process simple or nested key-value pairs submitted by forms.
- Your application handles POST, PUT, or PATCH requests with URL-encoded payloads.
Comparison with Other Body Parsers
Express also provides other middleware for parsing different types of request bodies:
express.json()
: Parses JSON payloads.express.text()
: Parses plain text payloads.express.raw()
: Parses raw binary data.
Each middleware is tailored for a specific content type, and express.urlencoded()
is specifically for URL-encoded form submissions.
Summary
express.urlencoded()
is middleware used to parse application/x-www-form-urlencoded data, typically sent from HTML form submissions.- It makes the form data accessible via
req.body
. - The
extended
option controls how the data is parsed:extended: true
allows for rich, nested objects, whileextended: false
only allows simple key-value pairs. - It's useful for handling POST requests where the client submits form data, and you need to access that data in your application.
This middleware is essential for handling traditional web forms in Express applications.