How can I deserialize arrays/objects posted to my NodeJS/Express web app?
express, javascript, node.js, query-string
Solution
Or use the `urlencoded` middleware (place it before any of your routes):
app.use(express.urlencoded());
...
app.post('/sendinfo', function(req, res) {
// req.body will now contain the object you described
...
});
Updated July 16, 2017
`urlencoded` removed from `express` node module in the latest version so please use this for now
const bodyParser = require("body-parser");
/** bodyParser.urlencoded(options)
* Parses the text as URL encoded data (which is how browsers tend to send form data from regular forms set to POST)
* and exposes the resulting object (containing the keys and values) on req.body
*/
app.use(bodyParser.urlencoded({
extended: true
}));
/**bodyParser.json(options)
* Parses the text as JSON and exposes the resulting object on req.body.
*/
app.use(bodyParser.json());
Problem
I'm writing an app in NodeJS/ExpressJS. I have a form like this: ``` <form method="post" action="/sendinfo"> <label>Name</label> <input type="text" name="name" /> <label>Address</label> <input type="text" name="address[number]" /> <input type="text" name="address[street]" /> <input type="text" name="address[suburb]" /> <input type="text" name="address[postcode]" /> <label>Phones</label> <input type="text" name="phones[0]" /> <input type="text" name="phones[1]" /> </form> ``` Here's my route: ``` app.post('/sendinfo', function (req, res) { // ...code to save the contents of req.body to the database... res.render('done'); }); ``` When the form gets submitted, my `req.body` looks like this: ``` { "name": "Jonathan", "address[number]": "1", "address[street]": "Test St", "address[suburb]": "TestSuburb", "address[postcode]": "1234", "phones[0]": "12345678", "phones[1]": "87654321" } ``` But I want it to instead look like this, with the values nested inside properties or arrays: ``` { "name": "Jonathan", "address": { "number": "1", "street": "Test St", "suburb": "TestSuburb", "postcode": "1234", }, "phones": [ "12345678", "87654321" ] } ``` How can I do this?