简体   繁体   English

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

[英]Node.js Passport Display username after successful login

I am using Node.js Passport and I'm trying to figure out how to display username after a successful login.我正在使用 Node.js Passport,我试图弄清楚如何在成功登录后显示用户名。 After reading the documentation I've verified that i have Sessions and Middleware configured which is what I need but what are my next steps?阅读文档后,我确认我已经配置了会话和中间件,这正是我需要的,但我的下一步是什么?

This is my users.js file:这是我的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;

And this is my app.js file:这是我的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'));
});

I've read a similar question on the site and the answer stated that:我在网站上读过一个类似的问题,答案是:

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

needs to be implemented.需要实施。 But I am confused as to where and how?但我很困惑在哪里以及如何? I tried placing it into to my users.js file but i get a "ReferenceError: app is not defined" error in terminal when restarting the node app.我尝试将它放入我的 users.js 文件中,但在重新启动节点应用程序时,我在终端中收到“ReferenceError: app is not defined”错误。 What are my next steps?我的下一步是什么? Any and every help is valued and appreciated.任何帮助都受到重视和赞赏。 Thank you.谢谢你。

EDIT:编辑:

I added我加了

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

to my users.js file and added:到我的 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>

to my profile.handlebars page but still no username display.到我的 profile.handlebars 页面,但仍然没有显示用户名。 What am i missing???我错过了什么???

SOLUTION: Apparently my code was correct and my problem was solved hours ago however it was hiding in plain site.解决方案:显然我的代码是正确的,我的问题在几个小时前解决了,但是它隐藏在普通站点中。 I am using Firefox to build my site and Chrome to conduct all my research and web searching.我正在使用 Firefox 来构建我的网站,并使用 Chrome 来进行我所有的研究和网络搜索。 After DEEP searching i stumbled upon another similar question to my own and this guy complained that he had <p>Hi, {{username}}</p> within his index file but only Hi was showing up within his browser.在深度搜索后,我偶然发现了另一个与我类似的问题,这个人抱怨他的索引文件中有<p>Hi, {{username}}</p>但只有Hi出现在他的浏览器中。 On the contrary neither Hi or {{username}} was showing in my browser.相反,我的浏览器中没有显示Hi or {{username}} My entire <p> tag was missing.我的整个<p>标签都不见了。 So i simply loaded my site in Chrome and there it was problem solved!所以我只是在 Chrome 中加载了我的网站,问题就解决了! Bad practice on my part for only using one browser but that's what I get for silly mistakes :)我只使用一个浏览器是不好的做法,但这就是我犯的愚蠢错误:)

You need to use the rendering part of the mentioned part of this code:您需要使用此代码中提到的部分的渲染部分:

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

ie, res.render('index', { username: req.user.username });res.render('index', { username: req.user.username }); at the right/required path.在正确/必需的路径上。

like you can try using it as就像您可以尝试将其用作

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

and consume(use) the rendered variable username in your view for displaying.并在您的视图中使用(使用)呈现的变量username进行显示。

If this doesn't work or you have some other problem, refer Nodejs Passport display username also.如果这不起作用或您有其他问题,请参考Nodejs Passport 显示用户名

My workaround was adding the req.user (if it exists, thus when loggedin) to the rendering.我的解决方法是将 req.user(如果存在,因此在登录时)添加到渲染中。 I've included both a hello, {{user}} and Dynamic navbar example.我已经包含了 hello、{{user}} 和动态导航栏示例。

I don't know if it's because I use handlebars instead of express-handelbars but the example I used to make this does not have to send the req.user object along for the render.我不知道是不是因为我使用把手而不是 express-handelbars 但我用来制作的示例不必为渲染发送 req.user 对象。 It automatically sends it along?它会自动发送吗? So I feel like my workaround is unnecesary if I do it right?所以如果我做对了,我觉得我的解决方法是不必要的?

Edit: this solution only works for 1 page.编辑:此解决方案仅适用于 1 页。 If you go to another route it doesn't send the object along anymore.如果你去另一条路线,它不会再发送对象了。

Edit2: Apparently with express 4 sending the user object along in req.user is the only way I've found so far. Edit2:显然,使用 express 4 在 req.user 中发送用户对象是我迄今为止发现的唯一方法。 But you'll have to send it along every route that requests data from the data base as well.但是您还必须沿着从数据库请求数据的每条路线发送它。

Confirmed edit 2 through this example: https://github.com/passport/express-4.x-local-example/blob/master/server.js通过此示例确认编辑 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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM