[英]Node.js Passport Display username after successful login
我正在使用 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 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 頁面,但仍然沒有顯示用戶名。 我錯過了什么???
解決方案:顯然我的代碼是正確的,我的問題在幾個小時前解決了,但是它隱藏在普通站點中。 我正在使用 Firefox 來構建我的網站,並使用 Chrome 來進行我所有的研究和網絡搜索。 在深度搜索后,我偶然發現了另一個與我類似的問題,這個人抱怨他的索引文件中有<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 });
在正確/必需的路徑上。
就像您可以嘗試將其用作
router.get('/profile', function(req, res){
res.render('profile', { username: req.user.username });
});
並在您的視圖中使用(使用)呈現的變量username
進行顯示。
如果這不起作用或您有其他問題,請參考Nodejs Passport 顯示用戶名。
我的解決方法是將 req.user(如果存在,因此在登錄時)添加到渲染中。 我已經包含了 hello、{{user}} 和動態導航欄示例。
我不知道是不是因為我使用把手而不是 express-handelbars 但我用來制作的示例不必為渲染發送 req.user 對象。 它會自動發送嗎? 所以如果我做對了,我覺得我的解決方法是不必要的?
編輯:此解決方案僅適用於 1 頁。 如果你去另一條路線,它不會再發送對象了。
Edit2:顯然,使用 express 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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.