# quick node.js express redis user management &#8211; 2

Date: 2017-01-22

<p dir="ltr">
  In the <a href="http://goldmanmalka.com/2016/12/27/node-js-express-redis-user-management/">previous post</a>, we installed the stack,
</p>

<p dir="ltr">
  Now we&#8217;ll figure out the user interface and files.
</p>

<p dir="ltr">
  <!--more-->
</p>

## first we&#8217;ll go to  app.js and create a Redis session:

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

## second we&#8217;ll edit the routes\user.js file

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

## Third we&#8217;ll add the views views/users/login.jade and views/users/register.jade

<p dir="ltr">
  I&#8217;m using jade with bootstrap, and <a href="https://1000hz.github.io/bootstrap-validator/">bootstrap validator</a>
</p>

### login.jade

<pre>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')</pre>

### register.jade

<pre>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')</pre>

&nbsp;

## and last, we&#8217;ll use it in a pages

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

&nbsp;
