Express 如何使用node、EJS、passport和session有条件地从2个导航栏选项进行渲染?

Express 如何使用node、EJS、passport和session有条件地从2个导航栏选项进行渲染?,express,session,passport.js,navbar,ejs,Express,Session,Passport.js,Navbar,Ejs,如何使用node、EJS、passport和session有条件地从2个导航栏选项进行渲染 我想有条件地从2个导航栏选项渲染。我正在使用EJS、passport和session。我试了几件事,但都没用。目标是,如果客户端未通过身份验证,则呈现登录导航栏;如果客户端已通过身份验证,则呈现带有选项的导航栏(如果客户端使用页面的相同其余部分对两个导航栏进行了身份验证) 我在这里发布了很多代码,这些代码是我在Brad Traversy的视频“Node.js With Passport Authentic

如何使用node、EJS、passport和session有条件地从2个导航栏选项进行渲染

我想有条件地从2个导航栏选项渲染。我正在使用EJS、passport和session。我试了几件事,但都没用。目标是,如果客户端未通过身份验证,则呈现登录导航栏;如果客户端已通过身份验证,则呈现带有选项的导航栏(如果客户端使用页面的相同其余部分对两个导航栏进行了身份验证)

我在这里发布了很多代码,这些代码是我在Brad Traversy的视频“Node.js With Passport Authentication | Full Project”(顺便说一句……感谢Brad.大粉丝!)之后编写的。我相信我接近导航栏文件中的解决方案。我只是需要一个真正知道自己在做什么的人的帮助(我不知道)。如果你们当中有人能看一下下面的文件,告诉我我遗漏了什么,我会非常感激

看起来Tiger Abrodi已经问了同样的问题,Discord团队解决了这个问题(见)。但是,答案没有显示出来。我相信这是一个非常有用的解决方案,应该为其他人发布在这里,所以我保证你的解决方案将继续发布在这里,让其他人看到。 谢谢大家

我的主页;你可以看到我用“include”来调用导航条,这很有效

<!-- Navigation Bar ----------------------------------->
<%- include('assets/nav-bar'); %>

<!--------- Main Body --------->
<div class="mainBodyContainter mBC2">
    <h3>Busca por Marca:</h3>
    <ul>
        <li>Marca</li>
        <li>Año</li>
        <li>Modelo</li>
        <li>Sub-Modelo</li>
    </ul>
    <button class="button">Buscar</button>
</div>

<!-- Right  ***  Anuncio -->
<%- include ('assets/main-ad') %>

<!----------------- Footings ----------------->     
<%- include ('assets/footings') %>
我的app.js;它很好用

const express = require('express');
const expressLayouts = require('express-ejs-layouts');
const mongoose = require('mongoose');
const app = express();
const db = mongoose.connection;
const flash = require('connect-flash');
const session = require('express-session');
const passport = require('passport');

// Passport config
require('./config/passport') (passport);

// Connect to Mongo
mongoose.set('useNewUrlParser', true);
mongoose.set('useUnifiedTopology', true);
mongoose.connect('mongodb://localhost/eyonke_server')
    .then(() => console.log('La base de datos de MongoDB conectó correctamente...'))
    .catch(err => console.log(err));

// EJS
app.use(expressLayouts);
app.set('view engine', 'ejs');
app.use(express.static(__dirname + '/views'));

// Bodyparser
app.use(express.urlencoded({ extended: false }));

// Express session middleware
app.use(session({
    secret: 'secret',
    resave: true,
    saveUninitialized: true,
  }));

// Passport middleware
app.use(passport.initialize());
app.use(passport.session());

// Connect flash
app.use(flash());

// Global Variables
app.use((req, res, next) => {
    res.locals.success_msg = req.flash('success_msg');
    res.locals.error_msg = req.flash('error_msg');
    res.locals.error = req.flash('error');
    next();
});

// Routes
app.use('/', require('./routes/index'));
app.use('/users', require('./routes/users'));

const PORT = process.env.PORT || 5000;

app.listen(PORT, console.log(`El servidor de eYonke esta corriendo en el puerto numero ${PORT}...`));
我的护照配置;很好

const express = require('express');
const router = express.Router();
const { ensureAuthenticated } = require('../config/auth');

// Home page
router.get('/', (req, res) => res.render('home'));


// Dashboard ***PROTECTED FOR NO ACCESS UNLESS LOGGED IN***
router.get('/dashboard', ensureAuthenticated, (req, res) => 
    res.render('dashboard', {
        name: req.user.name
    }));

module.exports = router;
const LocalStrategy = require('passport-local').Strategy;
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');

// Load User model
const User = require('../models/User');

module.exports = function(passport) {
    passport.use(
        new LocalStrategy({ usernameField: 'email'}, (email, password, done) => {
            //Match user
            User.findOne({ email: email })
                .then(user => {
                    if(!user) {
                        return done(null, false, { message: 'Email no registrado' });
                    }
                    // Match password
                    bcrypt.compare(password, user.password, (err, isMatch) => {
                        if(err) throw err;

                        if(isMatch) {
                            return done(null, user);
                        } else {
                            return done(null, false, { message: 'Contraseña incorrecta' });
                        }
                    });
                })
                .catch(err => console.log(err));
        })
    );

    // Session
    passport.serializeUser((user, done) => {
        done(null, user.id);
    });

    passport.deserializeUser((id, done) => {
        User.findById(id, (err, user) => {
            done(err, user);
        });
    });
}
module.exports = {
    ensureAuthenticated: function(req, res, next) {
        if(req.isAuthenticated()) {
            return next();
        }
        req.flash('error_msg', 'Necesitas entrar a tu cuenta para accesar este recurso');
        res.redirect('/'); /*if not authenticated, then redirected to home page*/
    }
}
const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const passport = require('passport');

//User model
const User = require('../models/User');

//Login page
router.get('/login', (req, res) => res.render('login'));

//Registration page
router.get('/register', (req, res) => res.render('register'));

// Register Handle
router.post('/register', (req, res) => {
    const { name, email, password, password2 } = req.body;
    let errors = [];
    //Check for errors
    //Check required fields
    if(!name || !email || !password || !password2) {
        errors.push({ msg: 'Por favor llena todos los campos'});
    }
    // Check passwords match
    if(password !== password2) {
        errors.push({ msg: 'Las contraseñas no son iguales'});
    }
    // Check password length
    if(password.length < 6) {
        errors.push({ msg: 'La contraseña debe tener al menos 6 caracteres'});
    }
    if(errors.length > 0) {
        res.render('register', {
            errors,
            name,
            email,
            password,
            password2
        });
    } else {
        // Validation passed
        User.findOne({ email: email })
            .then(user => {
                if(user) {
                    // User exists
                    errors.push({ msg: 'Email ya está registrado en eYonke'});
                    res.render('register', {
                        errors,
                        name,
                        email,
                        password,
                        password2
                    });
                } else {
                    const newUser = new User({
                        name,
                        email,
                        password
                    });
                    // Hash Password
                    bcrypt.genSalt(10, (err, salt) =>
                        bcrypt.hash(newUser.password, salt, (err, hash) => {
                            if(err) throw err;
                            // set password to hashed
                            newUser.password = hash;
                            // Save user
                            newUser.save()
                                .then(user => {
                                    req.flash('success_msg', 'Te has registrado exitosamente');
                                    res.redirect('/users/login');
                                })
                                .catch(err => console.log(err));
                        }))

                } 
            });
    }
});

// Login handle
router.post('/login', (req, res, next) => {
    passport.authenticate('local', {
        successRedirect: '/', /*'/dashboard',*/
        failureRedirect: '/users/login',
        failureFlash: true
      })(req, res, next);
});

// Logout handle
router.get('/logout', (req, res) => {
    req.logOut();
    req.flash('success_msg', 'Tu sessión ha terminado');
    res.redirect('/');
});

module.exports = router;
auth.js;很好

const express = require('express');
const router = express.Router();
const { ensureAuthenticated } = require('../config/auth');

// Home page
router.get('/', (req, res) => res.render('home'));


// Dashboard ***PROTECTED FOR NO ACCESS UNLESS LOGGED IN***
router.get('/dashboard', ensureAuthenticated, (req, res) => 
    res.render('dashboard', {
        name: req.user.name
    }));

module.exports = router;
const LocalStrategy = require('passport-local').Strategy;
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');

// Load User model
const User = require('../models/User');

module.exports = function(passport) {
    passport.use(
        new LocalStrategy({ usernameField: 'email'}, (email, password, done) => {
            //Match user
            User.findOne({ email: email })
                .then(user => {
                    if(!user) {
                        return done(null, false, { message: 'Email no registrado' });
                    }
                    // Match password
                    bcrypt.compare(password, user.password, (err, isMatch) => {
                        if(err) throw err;

                        if(isMatch) {
                            return done(null, user);
                        } else {
                            return done(null, false, { message: 'Contraseña incorrecta' });
                        }
                    });
                })
                .catch(err => console.log(err));
        })
    );

    // Session
    passport.serializeUser((user, done) => {
        done(null, user.id);
    });

    passport.deserializeUser((id, done) => {
        User.findById(id, (err, user) => {
            done(err, user);
        });
    });
}
module.exports = {
    ensureAuthenticated: function(req, res, next) {
        if(req.isAuthenticated()) {
            return next();
        }
        req.flash('error_msg', 'Necesitas entrar a tu cuenta para accesar este recurso');
        res.redirect('/'); /*if not authenticated, then redirected to home page*/
    }
}
const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const passport = require('passport');

//User model
const User = require('../models/User');

//Login page
router.get('/login', (req, res) => res.render('login'));

//Registration page
router.get('/register', (req, res) => res.render('register'));

// Register Handle
router.post('/register', (req, res) => {
    const { name, email, password, password2 } = req.body;
    let errors = [];
    //Check for errors
    //Check required fields
    if(!name || !email || !password || !password2) {
        errors.push({ msg: 'Por favor llena todos los campos'});
    }
    // Check passwords match
    if(password !== password2) {
        errors.push({ msg: 'Las contraseñas no son iguales'});
    }
    // Check password length
    if(password.length < 6) {
        errors.push({ msg: 'La contraseña debe tener al menos 6 caracteres'});
    }
    if(errors.length > 0) {
        res.render('register', {
            errors,
            name,
            email,
            password,
            password2
        });
    } else {
        // Validation passed
        User.findOne({ email: email })
            .then(user => {
                if(user) {
                    // User exists
                    errors.push({ msg: 'Email ya está registrado en eYonke'});
                    res.render('register', {
                        errors,
                        name,
                        email,
                        password,
                        password2
                    });
                } else {
                    const newUser = new User({
                        name,
                        email,
                        password
                    });
                    // Hash Password
                    bcrypt.genSalt(10, (err, salt) =>
                        bcrypt.hash(newUser.password, salt, (err, hash) => {
                            if(err) throw err;
                            // set password to hashed
                            newUser.password = hash;
                            // Save user
                            newUser.save()
                                .then(user => {
                                    req.flash('success_msg', 'Te has registrado exitosamente');
                                    res.redirect('/users/login');
                                })
                                .catch(err => console.log(err));
                        }))

                } 
            });
    }
});

// Login handle
router.post('/login', (req, res, next) => {
    passport.authenticate('local', {
        successRedirect: '/', /*'/dashboard',*/
        failureRedirect: '/users/login',
        failureFlash: true
      })(req, res, next);
});

// Logout handle
router.get('/logout', (req, res) => {
    req.logOut();
    req.flash('success_msg', 'Tu sessión ha terminado');
    res.redirect('/');
});

module.exports = router;
My users.js用于注册和登录/注销;很好

const express = require('express');
const router = express.Router();
const { ensureAuthenticated } = require('../config/auth');

// Home page
router.get('/', (req, res) => res.render('home'));


// Dashboard ***PROTECTED FOR NO ACCESS UNLESS LOGGED IN***
router.get('/dashboard', ensureAuthenticated, (req, res) => 
    res.render('dashboard', {
        name: req.user.name
    }));

module.exports = router;
const LocalStrategy = require('passport-local').Strategy;
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');

// Load User model
const User = require('../models/User');

module.exports = function(passport) {
    passport.use(
        new LocalStrategy({ usernameField: 'email'}, (email, password, done) => {
            //Match user
            User.findOne({ email: email })
                .then(user => {
                    if(!user) {
                        return done(null, false, { message: 'Email no registrado' });
                    }
                    // Match password
                    bcrypt.compare(password, user.password, (err, isMatch) => {
                        if(err) throw err;

                        if(isMatch) {
                            return done(null, user);
                        } else {
                            return done(null, false, { message: 'Contraseña incorrecta' });
                        }
                    });
                })
                .catch(err => console.log(err));
        })
    );

    // Session
    passport.serializeUser((user, done) => {
        done(null, user.id);
    });

    passport.deserializeUser((id, done) => {
        User.findById(id, (err, user) => {
            done(err, user);
        });
    });
}
module.exports = {
    ensureAuthenticated: function(req, res, next) {
        if(req.isAuthenticated()) {
            return next();
        }
        req.flash('error_msg', 'Necesitas entrar a tu cuenta para accesar este recurso');
        res.redirect('/'); /*if not authenticated, then redirected to home page*/
    }
}
const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const passport = require('passport');

//User model
const User = require('../models/User');

//Login page
router.get('/login', (req, res) => res.render('login'));

//Registration page
router.get('/register', (req, res) => res.render('register'));

// Register Handle
router.post('/register', (req, res) => {
    const { name, email, password, password2 } = req.body;
    let errors = [];
    //Check for errors
    //Check required fields
    if(!name || !email || !password || !password2) {
        errors.push({ msg: 'Por favor llena todos los campos'});
    }
    // Check passwords match
    if(password !== password2) {
        errors.push({ msg: 'Las contraseñas no son iguales'});
    }
    // Check password length
    if(password.length < 6) {
        errors.push({ msg: 'La contraseña debe tener al menos 6 caracteres'});
    }
    if(errors.length > 0) {
        res.render('register', {
            errors,
            name,
            email,
            password,
            password2
        });
    } else {
        // Validation passed
        User.findOne({ email: email })
            .then(user => {
                if(user) {
                    // User exists
                    errors.push({ msg: 'Email ya está registrado en eYonke'});
                    res.render('register', {
                        errors,
                        name,
                        email,
                        password,
                        password2
                    });
                } else {
                    const newUser = new User({
                        name,
                        email,
                        password
                    });
                    // Hash Password
                    bcrypt.genSalt(10, (err, salt) =>
                        bcrypt.hash(newUser.password, salt, (err, hash) => {
                            if(err) throw err;
                            // set password to hashed
                            newUser.password = hash;
                            // Save user
                            newUser.save()
                                .then(user => {
                                    req.flash('success_msg', 'Te has registrado exitosamente');
                                    res.redirect('/users/login');
                                })
                                .catch(err => console.log(err));
                        }))

                } 
            });
    }
});

// Login handle
router.post('/login', (req, res, next) => {
    passport.authenticate('local', {
        successRedirect: '/', /*'/dashboard',*/
        failureRedirect: '/users/login',
        failureFlash: true
      })(req, res, next);
});

// Logout handle
router.get('/logout', (req, res) => {
    req.logOut();
    req.flash('success_msg', 'Tu sessión ha terminado');
    res.redirect('/');
});

module.exports = router;
const express=require('express');
const router=express.router();
const bcrypt=require('bcryptjs');
const passport=require(‘passport’);
//用户模型
const User=require('../models/User');
//登录页面
router.get('/login',(req,res)=>res.render('login');
//注册页
router.get('/register',(req,res)=>res.render('register');
//寄存器句柄
路由器.post('/register',(req,res)=>{
const{name,email,password2}=req.body;
让错误=[];
//检查错误
//检查必填字段
如果(!name | | |!email | |!password | |!password2){
错误。推送({msg:'Por favor llena todos los campos'});
}
//检查密码是否匹配
如果(密码!==密码2){
错误。推送({msg:'Las contraseñas no son iguales'});
}
//检查密码长度
如果(密码长度<6){
错误。推送({msg:'La contraseña debe tener al-menos 6 caracteres'});
}
如果(errors.length>0){
res.render('寄存器'{
错误,
名称
电子邮件,
密码,
密码2
});
}否则{
//通过验证
User.findOne({email:email})
。然后(用户=>{
如果(用户){
//用户存在
错误。推送({msg:'Email ya estáe do en eYonke'});
res.render('寄存器'{
错误,
名称
电子邮件,
密码,
密码2
});
}否则{
const newUser=新用户({
名称
电子邮件,
密码
});
//散列密码
bcrypt.genSalt(10,(错误,盐)=>
bcrypt.hash(newUser.password,salt,(err,hash)=>{
如果(错误)抛出错误;
//将密码设置为哈希值
newUser.password=hash;
//保存用户
newUser.save()
。然后(用户=>{
请求flash('success_msg','Te已注册exitosamente');
res.redirect('/users/login');
})
.catch(err=>console.log(err));
}))
} 
});
}
});
//登录句柄
router.post('/login',(req,res,next)=>{
passport.authenticate('local'{
successRedirect:“/”、/*“/dashboard”*/
failureRedirect:“/users/login”,
failureFlash:正确
})(req、res、next);
});
//注销句柄
路由器.get('/logout',(req,res)=>{
请求注销();
要求闪存(“成功消息”,“您的终端服务”);
res.redirect('/');
});
module.exports=路由器;

我找到了Tiger A,他好心地帮我解决了这个问题。我对代码所做的更改如下:

app.use((req, res, next) => {
res.locals.user = req.user;
next();
1.-在app.js中,我添加了一个全局变量,如下所示:

app.use((req, res, next) => {
res.locals.user = req.user;
next();
}))

2.-在我的导航栏中,我将决策行替换为以下内容:

<% if (!user) { %>


这就成功了。现在,我可以根据用户是否经过身份验证来决定使用哪个导航栏。

我找到了Tiger A。他好心地帮我解决了这个问题。我对代码所做的更改如下:

app.use((req, res, next) => {
res.locals.user = req.user;
next();
1.-在app.js中,我添加了一个全局变量,如下所示:

app.use((req, res, next) => {
res.locals.user = req.user;
next();
}))

2.-在我的导航栏中,我将决策行替换为以下内容:

<% if (!user) { %>

这就成功了。现在,我可以根据用户是否经过身份验证来决定使用哪个导航栏