Руль не меняется при аутентификации

Это мой файл header.hbs

 <!doctype html>
    <html class = "no-js" lang = "">

    <head>
      <meta charset = "utf-8">
      <meta http-equiv = "x-ua-compatible" content = "ie=edge">
      <title>{{ title }}</title>
      <meta name = "description" content = "">
      <meta name = "viewport" content = "width=device-width, initial-scale=1">

      <link rel = "apple-touch-icon" href = "apple-touch-icon.png">
      <!-- Place favicon.ico in the root directory -->
      <link rel = "stylesheet" 
      href = "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0- 
      alpha.6/css/bootstrap.min.css" integrity = "sha384- 
      rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ"
        crossorigin = "anonymous">
      </head>

    <body>
      <!--[if lt IE 8]>
                <p class = "browserupgrade">You are using an 
    <strong>outdated</strong> browser. Please <a 
    href = "http://browsehappy.com/">upgrade your browser</a> to improve your 
    experience.</p>
            <![endif]-->
      <div class = "container">
        <div class = "header clearfix">
          <nav>
            <ul class = "nav nav-pills float-right">
              <li class = "nav-item">
                <a class = "nav-link" href = "/">Home <span class = "sr-only">     (current)</span></a>
              </li>
              {{#if isAuthenticated}}
              <li class = "nav-item">
                <a class = "nav-link" href = "/profile">Profile</a>
              </li>
              <li class = "nav-item">
                <a class = "nav-link" href = "/logout">Logout</a>
              </li>
              {{else}}
              <li class = "nav-item">
                <a class = "nav-link" href = "/register">Register</a>
              </li>
              <li class = "nav-item">
                <a class = "nav-link" href = "/login">Login</a>
              </li>
            {{/if}}
            </ul>
          </nav>
          <h3 class = "text-muted">Project name</h3>
        </div>

Это мой app.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var expressValidator = require('express-validator');


// Authentication Packages
var session = require('express-session');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var MySQLStore = require('express-mysql-session')(session);
var bcrypt = require('bcrypt');


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

var app = express();

require('dotenv').config();

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

// 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 }));
app.use(expressValidator());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

//storing the session in the database
var options = {
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database : process.env.DB_NAME
};

var sessionStore = new MySQLStore(options);

app.use(session({
  secret: 'fa6737b131bf59613f73afc6416d4ee6',
  resave: false,
  store: sessionStore,
  saveUninitialized: false,
  //cookie: { secure: true } //uncomment if it is https
}));
app.use(passport.initialize());
app.use(passport.session());

//authentication for the hbs
app.use((req,res,next)=>{
  res.locals.isAutheticated = req.isAuthenticated();
  next();
});

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

passport.use(new LocalStrategy(
  function(username, password, done) {
   //console.info(username);
   //console.info(password);
   const db = require('./db');

   db.query('SELECT id, password FROM users WHERE username = ?',[username], 
(err,results,fields)=>{
      if (err){done(err);}
      if (results.length === 0){done(null,false);} 
      else{
        //console.info(results[0].password.toString());
        const hash = results[0].password.toString();

        bcrypt.compare(password, hash, (err,response)=>{
          if (response == true){
            return done(null, {user_id:results[0].id}); 
          }
          else{
            return done(null,false);
          }
        });
      }
  });
  }
));

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


// Handlebars default config
const hbs = require('hbs');
const fs = require('fs');

const partialsDir = __dirname + '/views/partials';

const filenames = fs.readdirSync(partialsDir);

filenames.forEach(function (filename) {
  const matches = /^([^.]+).hbs$/.exec(filename);
  if (!matches) {
    return;
  }
  const name = matches[1];
  const template = fs.readFileSync(partialsDir + '/' + filename, 'utf8');
  hbs.registerPartial(name, template);
});

hbs.registerHelper('json', function(context) {
    return JSON.stringify(context, null, 2);
});


module.exports = app;

Это мой index.js

    var express = require('express');
    var router = express.Router();
    var expressValidator = require('express-validator');
    var passport = require('passport');
    const bcrypt = require('bcrypt');
    const saltRounds = 10;


    /* GET home page. */
    router.get('/', (req, res) => {
      console.info(req.user);
      console.info(req.isAuthenticated());
      res.render('home', {
        title: 'Home'
      });
    });

    router.get('/profile', authenticationMiddleware(),(req,res)=>{
      res.render('profile',{title:'Profile'});
    });

    router.get('/login', (req,res)=>{
      res.render('login',{title:'login'});
    });

    router.post('/login', passport.authenticate('local', {
      successRedirect:'/profile',
      failureRedirect:'/login'
    }));

    router.get('/logout', (req,res)=>{
      req.logout();
      req.session.destroy();
      res.redirect('/');
    });

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

    router.post('/register', function (req, res, next) {
      //using express validator to validate the data 
      req.checkBody('username', 'Username field cannot be empty.').notEmpty();
      req.checkBody('username', 'Username must be between 4-15 characters 
    long.').len(4, 15);
      req.checkBody('email', 'The email you entered is invalid, please try 
    again.').isEmail();
      req.checkBody('email', 'Email address must be between 4-100 characters 
    long, please try again.').len(4, 100);
      req.checkBody('password', 'Password must be between 8-100 characters 
    long.').len(8, 100);
      req.checkBody("password", "Password must include one lowercase character, 
    one uppercase character, a number, and a special character.").matches(/^(? 
   =.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.* )(?=.*[^a-zA-Z0-9]).{8,}$/, "i");
      req.checkBody('passwordMatch', 'Password must be between 8-100 characters 
    long.').len(8, 100);
      req.checkBody('passwordMatch', 'Passwords do not match, please try 
    again.').equals(req.body.password);
      const errors = req.validationErrors();
      if (errors) {
       // console.info(`errors:${JSON.stringify(errors)}`);
        res.render('register', {
          title: 'Registration Error',
          errors: errors
        });
      } else {
        //storing the data comming form post resquest 
        const username = req.body.username;
        const email = req.body.email;
        const password = req.body.password;

        const db = require('../db.js');

        bcrypt.hash(password, saltRounds, function (err, hash) {
          // Store hash in your password DB.
          let sql = "INSERT INTO users(username,email,password) VALUES (?,?,?)";
          db.query(sql, [username, email, hash], (error, result, fields) => {
            if (error) throw error;

            db.query('SELECT LAST_INSERT_ID() as user_id', (error, result, 
    field) => {
              if (error) throw error;

              const user_id = result[0];
             // console.info(result[0]);
              req.login(user_id, (err) => {
                res.redirect("/");
              });
            });

          });
        });
      }
    });

    passport.serializeUser(function (user_id, done) {
      done(null, user_id);
    });

    passport.deserializeUser(function (user_id, done) {
      done(null, user_id);
    });

    function authenticationMiddleware() {
      return (req, res, next) => {
      //  console.info(`req.session.passport.user: 
    ${JSON.stringify(req.session.passport)}`);

        if (req.isAuthenticated()) return next();
        res.redirect('/login')
      }
    }
    module.exports = router;

Это мой терминал
POST / логин 302103,029 мс - 60
GET / профиль 304 47,276 мс - -

Когда я вхожу в систему или регистрируюсь, мой руль должен изменить панель навигации в зависимости от аутентификации, но это не меняет ее, и я не вижу никаких ошибок, я попытался включить весь свой код и закомментировал детали. Нужна помощь

Это мой вывод терминала {user_id: 11} <br/> true <br/> GET / 304 36,198 мс - - <br/> {user_id: 11} <br/> true <br/> GET / 200 7,415 мс - 4016 <br/> GET /favicon.ico 404 7,269 мс - 1069 <br/> GET / логин 200 4,892 мс - 3191 <br/> POST / логин 302 101,649 мс - 60 <br/> GET / профиль 304 26,088 мс - - <br/> {user_id: 11} <br/> true <br/> GET / 304 5,087 мс - - <br/>

Kiran Bhattarai 25.10.2018 21:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
563
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В app.js все, что я делал, было изменено,

//authentication for the hbs
app.use((req,res,next)=>{
  if (req.isAuthenticated) res.locals.isAuthenticated = req.isAuthenticated();
  next();
});

и это сработало, я, поскольку вы используете функции обратного вызова, необходимо использовать условия, а не просто назначать значения.

Другие вопросы по теме