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中,那里是问题解决! 不好的做法,我的部分只使用一个浏览器,但这就是我得到愚蠢的错误:)

       

网上收集的解决方案 "Node.js Passport成功login后显示用户名"

你需要使用这段代码中提到的部分的渲染部分:

 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>