Express 如何使用node、EJS、passport和session有条件地从2个导航栏选项进行渲染?
如何使用node、EJS、passport和session有条件地从2个导航栏选项进行渲染 我想有条件地从2个导航栏选项渲染。我正在使用EJS、passport和session。我试了几件事,但都没用。目标是,如果客户端未通过身份验证,则呈现登录导航栏;如果客户端已通过身份验证,则呈现带有选项的导航栏(如果客户端使用页面的相同其余部分对两个导航栏进行了身份验证)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
我在这里发布了很多代码,这些代码是我在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) { %>
这就成功了。现在,我可以根据用户是否经过身份验证来决定使用哪个导航栏