expressjs / body-parser

Node.js body parsing middleware

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

pass options to qs thru urlencoded?

rossgrady opened this issue · comments

As documented thoroughly in various places, by default, qs collapses sparse arrays, which is painful for ppl who, for example, dynamically add additional form elements on the frontend & need to give them unique names like thing[x]

However, they finally added an option to not collapse sparse arrays!

You may also use allowSparse option to parse sparse arrays:

var sparseArray = qs.parse('a[1]=2&a[3]=5', { allowSparse: true });
assert.deepEqual(sparseArray, { a: [, '2', , '5'] });

(from the docs: https://github.com/ljharb/qs/blob/master/README.md#parsing-arrays )

So: Is it possible in the Express 4.16+ flavor of body-parser.urlencoded that has been slipstreamed back into Express, to pass args (such as allowSparse: true) to qs?

It is not, specifically because that parser is planned to be phased away from this module, so adding more options would just delay folks to use something more fitted for their custom qs (or other parser) use-case. See #60

We are trying to make it easier to make your own custom parsers, essentially bodyParser.text() and then just pass req.body string into your parser and then set req.body to the result. The expectation is that both the deprecation of qs built-in and the new generic constructor would be in 2.0. It's basically the raw-body module performing the stream-to-string and then placing the string into the function provided by the user (which could just call qs or anything with any arguments). It is a much more flexible solution. If you are curious, the main issue with qs is that there is no standard it is based off of, so there are so many different options to change how it parses, none of which are quite perfect. And there are other modules users want to use instead of qs for the urlencoded parsing, so we thought it would be a win-win for everyone (parse however you like) 👍

I am currently trying to get everything off of Travis CI by the end of this month, but I'll see what is happening to that generic parser PR here to see if that can be in a 4.x minor Express release for everyone.

Cool, that makes sense. I was kind of confused by the #60 recommendation to use JSON because I'm trying to just send a vanilla HTML POST form rather than having to convert it to JSON on the client side :)

But I absolutely understand that a dependency on a kind of "we make our own rules" parser like qs isn't exactly thrilling either.

And honestly my thinking about how to structure complex form data & then parse it hasn't evolved sufficiently since, uh, 2003 or so, so I could stand to do more thinking anyway.

Good luck with the Travis migration -- I'm literally in the midst of helping ~1000 repos migrate at <dayjob>. FWIW, Actions is pretty dang nifty.