Node.js Passport成功登录后显示用户名

时间:2016-05-14 17:22:32

标签: javascript node.js passport.js

我正在使用Node.js Passport,我试图弄清楚如何在成功登录后显示用户名。阅读完文档后,我已经确认我已经配置了会话和中间件,这是我需要的,但我接下来的步骤是什么?

这是我的 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文件,但我得到一个" ReferenceError:app未定义"重新启动节点应用程序时终端中的错误。 我接下来的步骤是什么?任何和每一个帮助都受到重视和赞赏。谢谢。

编辑:

我添加了

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页面但仍然没有用户名显示。我错过了什么???

解决方案:显然我的代码是正确的,我的问题在几小时前解决了,但它隐藏在普通网站中。我正在使用Firefox构建我的网站和Chrome来进行我的所有研究和网络搜索。在DEEP搜索之后,我偶然发现了另一个与我自己相似的问题,这家伙抱怨他的索引文件中有<p>Hi, {{username}}</p>,但只有Hi出现在他的浏览器中。相反,我的浏览器中都没有显示Hi or {{username}}。我的整个<p>标记丢失了。所以我只是在Chrome中加载了我的网站,问题就解决了!我只是使用一个浏览器的不良做法,但这是我得到的愚蠢错误:))

2 个答案:

答案 0 :(得分:2)

您需要使用此代码中提到部分的呈现部分:

app.get('/example', function(req, res) {
  res.render('index', { username: req.user.username });
});

即,res.render('index', { username: req.user.username });位于右侧/所需路径。

就像你可以尝试使用它一样

router.get('/profile', function(req, res){
  res.render('profile', { username: req.user.username });
});

并在视图中使用(使用)渲染变量username进行显示。

如果这不起作用或您还有其他问题,请同时参考Nodejs Passport display username

答案 1 :(得分:0)

我的解决方法是将req.user(如果存在,因此在登录时)添加到渲染中。我已经包含了hello,{{user}}和动态导航栏示例。

我不知道是不是因为我使用了把手而不是快速汉德棒,但是我用来制作它的例子并不需要为渲染发送req.user对象。它会自动发送吗?所以如果我做得对,我觉得我的解决方法是不必要的?

编辑:此解决方案仅适用于1页。如果你去另一条路线,它就不会再发送物体了。

Edit2:显然,快递4在req.user中发送用户对象是我到目前为止找到的唯一方法。但是,您必须沿着从数据库请求数据的每条路径发送它。

通过此示例确认编辑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>