1

In case of any validation errors I want to display appropriate error message in the same jade page(i.e register.jade).If not then I want to store the data with the help of schema object succesfully and return to my home page. But currently, I am getting all the error messages even though the inputs are correct.

I am using Express+Node+Mongodb+Mongoose.

May I know how to achieve it.

Relevant (12:55 min) video which i am following is - https://www.youtube.com/watch?v=jeiP4jN1mfs&list=PLNiY_2deiFolObKp8sav6TmxnnjVFuwqu&index=16

Here is my code -

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 LocalStrategy = require('passport-local').Strategy;
var bodyParser = require('body-parser');

var multer = require('multer');

var upload = multer({ dest: './uploads' });
var flash = require('connect-flash');
var mongo = require('mongodb');
var mongoose = require('mongoose');
var db = mongoose.connection;

var index = require('./routes/index');
var users = require('./routes/users');

var app = express();

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


// 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());

//Validator
app.use(expressValidator({
  errorFormatter: function(param, msg, value) {
      var namespace = param.split('.')
      , root    = namespace.shift()
      , formParam = root;

    while(namespace.length) {
      formParam += '[' + namespace.shift() + ']';
    }
    return {
      param : formParam,
      msg   : msg,
      value : value
    };
  }
}));


app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use(flash());
app.use(function (req, res, next) {
  res.locals.messages = require('express-messages')(req, res);
  next();
});
app.use('/', index);
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(inside routes folder)

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

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;



    if(req.files && req.files.profileimage){
        console.log('Uploading FIle...');

        //FIle Info
        var profileImageOriginalName    = req.files.profileimage.originalname;
        var profileImageName            = req.files.profileimage.name;
        var profileImageMime            = req.files.profileimage.mimetype;
        var profileImagePath            = req.files.profileimage.path;
        var profileImageExt             = req.files.profileimage.extension;
        var profileImageSize            = req.files.profileimage.size;
    } else{
        // Set a Default Image
        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','Email not valid').isEmail();
    req.checkBody('username','Username field is required').notEmpty();
    req.checkBody('password','password field is required').notEmpty();
    req.checkBody('password2','passwords do not 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

        });

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

        //Success Messsage 
        req.flash('success','You are now registered and may log in');

        res.location('/');
        res.redirect('/');
    }
});
module.exports = router;

register.jade inside views folder

extends layout

block content
    h1 Register
    p Please Register using the 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 Name')
        .form-group
            label Email
            input.form-control(name='email', type='email',placeholder='Enter Email')
        .form-group
            label Username
            input.form-control(name='username', type='text',placeholder='User Name')
        .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='Confirm Password')
        .form-group
            label Profile Image
            input.form-control(name='profileimage', type='file')
        input.btn.btn-default(name='submit',type='submit',value='Register')

screenshots:

enter image description here

1 Answer 1

2

from express github repo req.validationErrors([mapped]) is listed under the Deprecated API i quote them "The following methods are deprecated. While they work, their API is unflexible and sometimes return weird results if compared to the bleeding edge req.getValidationResult().

Additionally, these methods may be removed in a future version."

so you should this method instead :-

req.getValidationResult()
   .then(function(result){
     console.log(result.array());
   });

source :- https://github.com/ctavan/express-validator#usage

Sign up to request clarification or add additional context in comments.

5 Comments

can you help me out with more specific answer . @Fadi Abo Msalam
in the file users.js(inside routes folder) replace var errors = req.validationErrors(); with req.getValidationResult() .then(function(result){ you else -no error from validation - }) .catch(function(error){ your code for handling error }); is this clear enough
That was more than clear. thanks a lot @Fadi Abo Msalam.
no problem my friend but if the solution worked please mark the question as solved in order to help others . regards
Actually the other way is not working now .the error messages are not getting displayed . my code snippet of users.js is below :

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.