Node.js Passport成功login后显示用户名
我正在使用Node.js护照,并试图找出如何成功login后显示用户名。 在阅读完文档之后,我已经validation过我configuration了会话和中间件,这是我需要的,但是接下来的步骤是什么?
这是我的users.js文件:
var express = require('express'); var router = express.Router(); var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var User = require('../models/user'); // Home router.get('/index', function(req, res){ res.render('index'); }); // Profile router.get('/profile', function(req, res){ res.render('profile'); }); // Register router.get('/register', function(req, res){ res.render('register'); }); // Login router.get('/login', function(req, res){ res.render('login'); }); // About-us router.get('/about-us', function(req, res){ res.render('about-us'); }); // Register User router.post('/register', function(req, res){ var email = req.body.email; var username = req.body.username; var password = req.body.password; // Validation req.checkBody('username', 'Username is Required').notEmpty(); req.checkBody('email', 'Email is required').notEmpty(); req.checkBody('email', 'Email is not valid').isEmail(); req.checkBody('password', 'Password is required').notEmpty(); var errors = req.validationErrors(); if(errors){ res.render('register',{ errors:errors }); } else { var newUser = new User({ email:email, username: username, password: password, }); User.createUser(newUser, function(err, user){ if(err) throw err; console.log(user); }); req.flash('success_msg', 'You are now registered. Log In!'); res.redirect('/users/login'); } }); passport.use(new LocalStrategy( function(username, password, done) { User.getUserByUsername(username, function(err, user){ if(err) throw err; if(!user){ return done(null, false, {message: 'User does not exist!'}); } User.comparePassword(password, user.password, function(err, isMatch){ if(err) throw err; if(isMatch){ return done(null, user); } else { return done(null, false, {message: 'Invalid password'}); } }); }); })); passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { User.getUserById(id, function(err, user) { done(err, user); }); }); router.post('/login', passport.authenticate('local', {successRedirect:'/users/profile', failureRedirect:'/users/login',failureFlash: true}), function(req, res) { res.redirect('/users/profile') }); router.get('/logout', function(req, res){ req.logout(); req.flash('success_msg', ''); res.redirect('/'); }); module.exports = router;
这是我的app.js文件:
var express = require('express'); var path = require('path'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var exphbs = require('express-handlebars'); var expressValidator = require('express-validator'); var flash = require('connect-flash'); var session = require('express-session'); var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var mongo = require('mongodb'); var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/loginandregister'); var db = mongoose.connection; var routes = require('./routes/index'); var users = require('./routes/users'); // Init App var app = express(); // View Engine app.set('views', path.join(__dirname, 'views')); app.engine('handlebars', exphbs({defaultLayout:'layout'})); app.set('view engine', 'handlebars'); // BodyParser Middleware app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); // Set Static Folder app.use(express.static(path.join(__dirname, 'public'))); app.use('/public', express.static('public')); // Express Session app.use(session({ secret: 'secret', saveUninitialized: true, resave: true })); // Passport init app.use(passport.initialize()); app.use(passport.session()); // Express Validator app.use(expressValidator({ errorFormatter: function(param, msg, value) { var namespace = param.split('.') , root = namespace.shift() , formParam = root; while(namespace.length) { formParam += '[' + namespace.shift() + ']'; } return { param : formParam, msg : msg, value : value }; } })); // Connect Flash app.use(flash()); // Global Vars app.use(function (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'); res.locals.user = req.user || null; next(); }); app.use('/', routes); app.use('/users', users); // Set Port app.set('port', (process.env.PORT || 3000)); app.listen(app.get('port'), function(){ console.log('Server started on port '+app.get('port')); });
我在网站上看过类似的问题,答案是:
app.get('/example', function(req, res) { res.render('index', { username: req.user.username }); });
需要执行。 但我很困惑,在哪里以及如何? 我试图把它放到我的users.js文件中,但是当重新启动节点应用程序时,在terminal出现“ReferenceError:app is not defined”错误。 我的下一步是什么? 任何和每一个帮助是重视和赞赏。 谢谢。
编辑:
我补充说
router.get('/profile', function(req, res){ res.render('profile', { username: req.user.username }); });
我的users.js文件,并补充说:
<header> <h1>Hello?</h1> {{#if user}} <p>Hello {{username}}</p> {{else}} <p>Please <a href='/users/login'>Log In</a></p> {{/if}} </header>
到我的profile.handlebars页面,但仍然没有用户名显示。 我错过了什么?
解决scheme:显然,我的代码是正确的,我的问题几个小时前解决,但它隐藏在普通的网站。 我使用Firefox来build立我的网站和Chrome进行我所有的研究和networkingsearch。 DEEPsearch后,我偶然发现了另外一个类似的问题,他抱怨说<p>Hi, {{username}}</p>
他的索引文件中有<p>Hi, {{username}}</p>
,但只有Hi
出现在他的浏览器中。 相反, Hi or {{username}}
在我的浏览器中都没有显示。 我的整个<p>
标记丢失了。 所以我简单地加载我的网站在Chrome中,那里是问题解决! 不好的做法,我的部分只使用一个浏览器,但这就是我得到愚蠢的错误:)
你需要使用这段代码中提到的部分的渲染部分:
app.get('/example', function(req, res) { res.render('index', { username: req.user.username }); });
即, res.render('index', { username: req.user.username });
在正确的/所需的path。
像你可以尝试使用它
router.get('/profile', function(req, res){ res.render('profile', { username: req.user.username }); });
并在视图中使用(使用)呈现的variablesusername
来显示。
如果这不起作用或者您还有其他问题,请参阅Nodejs Passport显示用户名 。
我的解决方法是将req.user(如果它存在,因此login时)添加到呈现。 我已经包括了你好,{{用户}}和dynamic导航栏的例子。
我不知道是不是因为我使用handlebars而不是express-handelbars,但是我用来做这个的例子不需要发送req.user对象。 它会自动发送它? 所以我觉得我的解决方法是不必要的,如果我做对了吗?
编辑:这个解决scheme只适用于1页。 如果你去另一条路线,它不再发送对象。
编辑2:显然与快递4发送用户对象在req.user是唯一的方式,我发现迄今。 但是,您必须沿着从数据库请求数据的每个path发送它。
确认编辑2通过这个例子: https : //github.com/passport/express-4.x-local-example/blob/master/server.js
// Get Homepage router.get('/', function(req,res){ Job.find({}) .exec(function(err, jobs){ if(err){ res.send('Error occured', err); } else { res.render('jobs', {jobs, user:req.user}); } }); }); <nav> <ul class="nav nav-pills pull-right"> {{#if user}} <li role="presentation"><span class="glyphicons glyphicons-user"></span><p style='color:white'>Hello {{user.name}}</p></li> <li role="presentation"><a href="/users/logout">Logout</a></li> {{else}} <li role="presentation"><a href="/users/login">Login</a></li> <li role="presentation"><a href="/users/register">Register</a></li> {{/if}} </ul> </nav>