简体   繁体   中英

Why is ExpressJS request body not working

I am posting here for first time So if anything wrong is with post then please tell me. I am new to node and express . I have created a simple registration form , but when I press Register(submit) button the I got req.body.name as "undefiend" . Below I have attached my app.js, users.js and register.jade file.

register.jade

extends layout

    block content
        h1 Register
        p Please Register using a form below
        ul.errors
            if errors
                each error , i in errors
                    li.alert.alert-danger #{error.msg}
        form(method='post',action='/users/register',enctype='multipart/form-data')
            .form-group
                label Name
                input.form-control(name='name',type='text',placeholder='Enter Your Lucky Name')
            .form-group
                label Email
                input.form-control(name='email',type='email',placeholder='Enter Your Email')
            .form-group
                label Password
                input.form-control(name='password',type='password',placeholder='Enter Password')
            .form-group
                label Confirm Password
                input.form-control(name='password2',type='password',placeholder='Enter Password')
            .form-group
                label Profie Image
                input.form-control(name='profileimage',type='file')

            input.btn.btn-default(name='submit',type='submit',value='Register') 

app.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var expressValidator=require('express-validator');
var cookieParser = require('cookie-parser');
var session=require('express-session');
var passport=require('passport');
var LocalStartegy=require('passport-local').Strategy;
var bodyParser = require('body-parser');
//var multer=require('multer');
var flash=require('connect-flash');
var mongo=require('mongodb');
var mongoose=require('mongoose');
var db=mongoose.connection;
//var upload=multer({dest:'./uploads'});
var routes = require('./routes/index');
var users = require('./routes/users');
var multer = require('multer');
var upload = multer({ dest: './uploads' });
var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
//Handle file upload
app.use(multer({dest:'./uploads'}));

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
//Handle express sessions
app.use(session({
    secret:'secret',
    saveUninitialized:true,
    resave:true
}));
//passport
app.use(passport.initialize());
app.use(passport.session());
app.use(expressValidator());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(flash());
app.use(require('connect-flash')());
app.use(function (req, res, next) {
    res.locals.messages = require('express-messages')(req, res);
        next();
}); 

app.use('/', routes);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

// 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');
});

module.exports = app; 

users.js

var express = require('express');
var router = express.Router();
var User = require('../models/user');

/* GET users listing. */
router.get('/', function(req, res, next) {
    res.send('respond with a resource');
});

/* GET users listing. */
router.get('/register', function(req, res, next) {
    res.render('register',{
        'title':'Register'
    });
});

router.get('/login', function(req, res, next) {
    res.render('login',{
        'title':'Login '
    });
});

router.post('/register',function(req,res,next) {
    //Get form Values
    var name=req.body.name;
    var email=req.body.email;
    //var username=req.body.username;
    var password=req.body.password;
    var password2=req.body.password2;
    console.log('hello ' +req.body);  //gets hello [object Object]
    console.log('hello' + req.body.name); //H=hello undefined 


    //Check For Image Field
    if(req.files.profileimage) {
        console.log("uploding file");
        var profileImageOriginalName=req.files.profileimage.originalname;
        var profileImageName=req.files.profileimage.name;
        var profileImageMime=req.files.profileimage.mime;
        var profileImagePath=req.files.profileimage.path;
        var profileImageExt=req.files.profileimage.extension;
        var profileImageSize=req.files.profileimage.size;
    } else {
        var profileImageName='NoImage.png';
    }

    //Form Validation

    req.checkBody('name','Name Field is Required').notEmpty();
    req.checkBody('email','Email Field is Required').notEmpty();
    req.checkBody('email','Enter Correct Email').isEmail();
    req.checkBody('password','Password  Field is Reqired').notEmpty();
    req.checkBody('password2','Password Doesn\'t match').equals(req.body.password);

    //Check For Errors

    var errors = req.validationErrors();
    if(errors) {
        res.render('register', {
            errors:errors,
            name:name,
            email:email,
            username:username,
            password:password,
            password2:password2
        });
    } else {
        var newUser = new User({
            name:name,
            email:email,
            // username:username,
            password:password,
            //profileimage:profileImageName
        });

        User.createUser(newUser,function(err,user){
            if(err) throw err;
            console.log(user);
        });

        req.flash('success','You Have Successfulyy Registerd');
        res.location('/');
        res.redirect('/'); 
    }

});
module.exports = router;

The body property is not a member of Response , it's member of Request . So your code should be correct as follow.

Use console.log('hello ' + req.body); instead of console.log('hello ' + res.body);

var express = require('express');
var router = express.Router();
var User = require('../models/user');

/* GET users listing. */
router.get('/', function (req, res, next) {
    res.send('respond with a resource');
});
/* GET users listing. */
router.get('/register', function (req, res, next) {
    res.render('register', {
        'title': 'Register'
    });
});

router.get('/login', function (req, res, next) {
    res.render('login', {
        'title': 'Login '
    });
});

router.post('/register', function (req, res, next) {
    //Get form Values
    var name = req.body.name;
    var email = req.body.email;
    //var username=req.body.username;
    var password = req.body.password;
    var password2 = req.body.password2;

    console.log('hello ' + req.body);  //gets undefined


    //Check For Image Field
    if (req.files.profileimage) {
        console.log("uploding file");
        var profileImageOriginalName = req.files.profileimage.originalname;
        var profileImageName = req.files.profileimage.name;
        var profileImageMime = req.files.profileimage.mime;
        var profileImagePath = req.files.profileimage.path;
        var profileImageExt = req.files.profileimage.extension;
        var profileImageSize = req.files.profileimage.size;
    } else {
        var profileImageName = 'NoImage.png';
    }

    //Form Validation

    req.checkBody('name', 'Name Field is Required').notEmpty();
    req.checkBody('email', 'Email Field is Required').notEmpty();
    req.checkBody('email', 'Enter Correct Email').isEmail();
    req.checkBody('password', 'Password  Field is Reqired').notEmpty();
    req.checkBody('password2', 'Password Doesn\'t match').equals(req.body.password);

    //Check For Errors

    var errors = req.validationErrors();
    if (errors) {
        res.render('register', {
            errors: errors,
            name: name,
            email: email,
            username: username,
            password: password,
            password2: password2
        });
    } else {
        var newUser = new User({
            name: name,
            email: email,
            // username:username,
            password: password,
            //profileimage:profileImageName
        });

        User.createUser(newUser, function (err, user) {
            if (err) throw err;
            console.log(user);

        });


        req.flash('success', 'You Have Successfulyy Registerd');
        res.location('/');
        res.redirect('/');
    }

});
module.exports = router;

That's because you're not using multer properly.

// Declare
var upload = multer({ dest: 'uploads/' })
...

/** 
 * Use multer as the middleware for this route. This is should parse multipart/form-data encoding
 * and pick up the uploaded image file and assign to req.file.
**/
router.post('/register', upload.single('profileimage), function (req, res, next) {
  console.log(req.file); // you will see fields related to your uploaded file.
  console.log(req.body); // you will see your form fields
  ...
})

...

First, try without file in your form remove enctype attribute from your form element

enctype='multipart/form-data' 

where your body-parser must work and then you will get request data in req.body property. if you intend to use enctype with file uploading via form, you have to configure your multer correctly, place this code in users.js file

var multer = require('multer');
var upload = multer({ dest: './uploads' }); // make sure you have uploads folder  
//(I would recommend using disk storage for complete control over uploaded files).

and when you are handling your post request

router.post('/register', upload.single('field_name'), function(req,res,next){
    //req.body will have text data
    // req.file will have file uploaded via form.

}); 
// make sure what ever you have name attribute value in from file input
// use that instead of <filed_name>. in your case 'profileimage'.

now multer will parse your incoming data and as we used uplaod.single() file will be availabel in

req.file

and if you used uplaod.array() file will be availabel in

req.files

and all the text field value will be in

req.body

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