quick node.js express redis user management – 2

erangoldman@gmail.com, 22 January 2017

In the previous post, we installed the stack,

Now we’ll figure out the user interface and files.

first we’ll go to  app.js and create a Redis session:

var session = require('express-session');
 var RedisStore = require('connect-redis')(session);

app.use(session({
   store: new RedisStore({
   db: 0
 }),
   secret: 'SOME RANDOM WORDS',
   resave: true,
   saveUninitialized: true
 }, connected = false));

second we’ll edit the routes\user.js file

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

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

router.get('/register', function(req, res, next) {
   res.render('users/register');
 });

router.post('/auth', function(req, res, next) {
   users.findOne({
   email: req.body.email
 }, function(err, result) {
   if (err) throw err;
   if (result) {
   if ("password" in result) {
   if (result.password == req.body.password) {
   res.locals.session.connected = true;
   res.locals.session.UserName = result.name;
   res.send("ok");
 } else {
   res.send("pw"); // pasword doesn't much
 }
 } else {
   res.send("oe"); // other error
 }
 } else {
   res.send("und"); // user not in db
 }
 });
 });

router.post('/reg', function(req, res, next) {
 users.findOne({
   email: req.body.email
 }, function(err, result) {
   if (err) throw err;
   if (!result) {
     users.insert({
     email: req.body.email,
     name: req.body.name,
     password: req.body.password
   });
   res.send('ok');
 } else {
   res.send('User already exist');
 }
 });
 });

router.get('/validateEmail', function (req, res) {
 users.findOne({
   email: req.query.email
   }, function(err, result) {
   if (err) throw err;
   if (result) {
     res.writeHead(400, 'Email already exist');
     res.send();
   } else {
     res.sendStatus(200);
   }
 });
 });

router.get('/logout', function(req, res, next) {
   res.locals.session.connected = false;
   res.redirect("/");
 });

Third we’ll add the views views/users/login.jade and views/users/register.jade

I’m using jade with bootstrap, and bootstrap validator

login.jade

extends ../layout

block content
 .row
   .col-md-4
   .col-md-4
     h1 Login :
   .col-md-4
 .row
   .col-md-4
   .col-md-4
     #errorMessage.text-center
     form(data-toggle="validator" role="form")
       .form-group
         label.control-label(for='inputEmail') Email
         input#Email.form-control(type='email', placeholder='Email', data-error='Bruh, that email address is invalid', required='')
         .help-block.with-errors
       .form-group
         label.control-label(for='inputEmail') Password
         input#Password.form-control(type='password', placeholder='Password', required='')
        .help-block.with-errors
      .form-group
         button#btnLogin.btn.btn-primary(type='submit') Submit

  .row
    .col-md-8
    .col-md-4
      a(href="/users/register") Register
   .col-md-4

block scripts
 script(src='/js/auth.js')
 script(src='/js/validator.min.js')

register.jade

extends ../layout

block content
 .row
   .col-md-4
   .col-md-4
     h1 Register:
   .col-md-4
 .row
   .col-md-4
   .col-md-4
     form(data-toggle="validator" role="form")
       .form-group
         label.control-label(for='Name') Name
         input#Name.form-control(type='text', placeholder='John Doe', required='')
         .help-block.with-errors
       .form-group
         label.control-label(for='inputEmail') Email
         input#Email.form-control(type='email', name="email", placeholder='Email', data-remote="/users/validateEmail", required='')
         .help-block.with-errors
       .form-group
         label.control-label(for='inputPassword') Password
      .form-inline.row
      .form-group.col-sm-6
        input#Password.form-control(type='password', data-minlength='6', placeholder='Password', required='')
       .help-block Minimum of 6 characters
     .form-group.col-sm-6
       input#PasswordConfirm.form-control(type='password', data-match='#Password', data-match-error="Whoops, these don't match", placeholder='Confirm', required='')
       .help-block.with-errors
     .form-group
       .checkbox
       label
       input#terms(type='checkbox', required='')
         | We will send you alerts from time to time, And occasionally updates about the project
       .help-block.with-errors
    .form-group
       button#register.btn.btn-primary(type='submit') Submit
   .col-md-4

block scripts
 script(src='/js/auth.js')
 script(src='/js/validator.min.js')

 

and last, we’ll use it in a pages

router.get('/CURRENT_PAGE', function(req, res, next) {
 if (!res.locals.session.connected) {
   return res.redirect('/users/login?returnpath=' + encodeURIComponent('/CURRENT_PAGE'));
 } else {
   GENERATE THE PAGE ETC...
 });
 });