简体   繁体   中英

Req.Body is returning “undefined” values

I have added body-parser to my application app.js file. I have a routes folder and a controllers folder which handles my request.

Initially, I did not have body-parser added to my application. When I added body-parser and console logged req.body I got an empty object. When I console logged req.body.email , req.body.password , and req.body.displayName values from postman were read as undefined.

app.js

let createError = require('http-errors');
let express = require('express');
let path = require('path');
let cookieParser = require('cookie-parser');
let logger = require('morgan');
let bodyParser = require('body-parser');
let assert = require('assert');

if (process.env.NODE_ENV !== 'production') {
  require('dotenv').config()
}

let usersRouter = require('./routes/user');

let app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

app.use('/user', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

// MongoDB Connection
const db = {};
const MongoClient = require('mongodb').MongoClient;

MongoClient.connect(process.env.MONGODB_CONNECT_URL, (err, client) => {
  // Connection works dont worry about it
});

module.exports = app;

routes/user.js

const express = require('express');
const router = express.Router();
const user = require('../controllers/user');

router.post('/', user.createUser);
router.delete('/:id', user.deleteUser);
router.get('/:id', user.loginUser);

module.exports = router;

controllers/user.js

const bcrypt = require('bcryptjs');
const Joi = require('joi');
const ObjectId = require('mongodb').ObjectID;

exports.createUser = async (req, res, next) => {
    console.log('Request body: ', req.body);
    const email = req.body.email;
    const password = req.body.password;
    const displayName = req.body.displayName;

    console.log('Email: ', email);
    console.log('Password: ', password);
    console.log('Display name: ', displayName);
};

Please make sure that you are adding content-type header in postman content-type : application/json also in body tab select raw and beside raw select json from drop-down list. Check this

https://i.stack.imgur.com/ZDhcl.png

You are probably trying to send form-data with Postman which sends a multipar body, body parser cannot handle multipart bodies. For handling multipart bodies you have to use a different module, I normally use multer .

With multer installed you just have to include it and it as middleware (under you body-parser for instance) using none() since in this case you want to handle text-only multipart body (More information about this in multer docs

let multer = require('multer');
app.use(multer().none());

Besides that I wanted to mention you are including two body parsers in your code, the express body parser

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

and an external body-parser

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

Pick one, you don't need both, the best option for me would be to keep the one that comes with express, this way you don't have to install any more external packages.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM