Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node.js (with express & bodyParser): unable to obtain form-data from post request

I can't seem to recover the form-data of a post request sent to my Node.js server. I've put below the server code and the post request (sent using postman in chrome):

Post request

POST /api/login HTTP/1.1 Host: localhost:8080 Cache-Control: no-cache  ----WebKitFormBoundaryE19zNvXGzXaLvS5C Content-Disposition: form-data; name="userName"  jem ----WebKitFormBoundaryE19zNvXGzXaLvS5C 

NodeJS server code

var express    = require('express');        // call express var app        = express();                 // define our app using express var bodyParser = require('body-parser');  app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use(bodyParser());  app.all('/*', function(req, res, next) {     res.header('Access-Control-Allow-Origin', '*');     res.header('Access-Control-Allow-Headers', 'Content-Type,accept,access_token,X-Requested-With');     next(); });  var port = process.env.PORT || 8080;        // set our port  var router = express.Router();              // get an instance of the express Router  router.get('/', function(req, res) {      res.json({ message: 'I am groot!' });    });  // Login router.route('/login')      .post(function(req, res){          console.log('Auth request recieved');          // Get the user name         var user = req.body.userName;          var aToken = getToken(user);          res.json({              'token':'a_token'         });     });  app.use('/api', router);  app.listen(port); 

The login method tries to obtain the req.body.userName, however, req.body is always empty. I've seen other cases on SO describing such behavior but none of the related answers did apply here.

Thanks for helping out.

like image 827
Jem Avatar asked Oct 13 '14 19:10

Jem


People also ask

Does node JS come with Express?

Yes, as in practice, Express IS a Node Package Manager (npm) module (a.k.a. a package) in as much as it's added to an application like other modules from npm.

Is node JS and express JS same?

Node. js is a platform for building the i/o applications which are server-side event-driven and made using JavaScript. Express. js is a framework based on Node.

Why Express is used in Node JS?

Express Overview Allows to set up middlewares to respond to HTTP Requests. Defines a routing table which is used to perform different actions based on HTTP Method and URL. Allows to dynamically render HTML Pages based on passing arguments to templates.

Is node JS express good?

Express is a big hit among developers for the speed it delivers to Node. js applications. In terms of speed, a simple 'Hello, World' benchmark performance shows that an Express program can handle 11,202 requests per second.


1 Answers

In general, an express app needs to specify the appropriate body-parser middleware in order for req.body to contain the body.

[EDITED]

  1. If you required parsing of url-encoded (non-multipart) form data, as well as JSON, try adding:

    // Put this statement near the top of your module var bodyParser = require('body-parser');   // Put these statements before you define any routes. app.use(bodyParser.urlencoded()); app.use(bodyParser.json()); 

    First, you'll need to add body-parser to the dependencies property of your package.json, and then perform a npm update.

  2. To handle multi-part form data, the bodyParser.urlencoded() body parser will not work. See the suggested modules here for parsing multipart bodies.

like image 120
cybersam Avatar answered Sep 20 '22 08:09

cybersam