I am amazed that NodeJS' main network server package, Express, does not handle Post data on its own. I just don't get it. It requires a package called Body-Parser.
I copied in the sample code from the Express website
http://expressjs.com/4x/api.html#req.body
got the required packages and made a little form to test it.
It did not work.
The docs explain that Body-Parser builds a request.body that contains the post data but it was empty. It did exist, but it was empty.
I did one million things to make sure that I was doing what I thought I was doing. Postman? Check. Curl? Check. Inch by inch inspection of my entry page? Check.
I got to looking at the post on the way into the page in Firebug. I noticed that the encoding that Firefox was using was
application/x-www-form-urlencoded
The Body-Parser docs say that any of their decoders will take a type parameter to specify this. I found an example and tried it out:
{type:'application/x-www-form-urlencoded'}
Nope. I tried this in some decoder called raw(), the urlencoded() one, I even put in into json() just in case. Nada.
At my wits end, I'm just trying things in Postman. I tell it to encode it in various ways and, Voila!!, when I choose
multipart/form-data
WTF? I think. Everything specifically tells me that Body-Parser SPECIFICALLY DOES NOT DO MULTIPART form data.
How much clearer could it be?
Then I realize, the sample code from the Express docs caused me to install (last night when this nightmare began) something called Multer. Experimentation tells me that this is the reason I can do multipart/form-data. Without Multer, I get nothing.
But, without Multer, I get nothing no matter what I do. I did everything I have tried before and could not get Body-Parser to work. With Multer, only multipart/form-data. Without, nothing.
If anyone can enter a comment telling me how I got this wrong, I would be grateful.
UPDATE: It was none of the above!!!
It turns out that, in the course of the above screwing around, I moved the assignment of the router to follow the assignment of the Body_Parser. It executes the router before the parser if you tell it to. I had inserted the new body-parser code after the route. No reason, it just happened .
app.use(bodyParser.urlencoded({ extended: true }))
must precede
app.use('/', router);