Как получить профиль текущего пользователя в узле js
Я использую MEAN Stack и мангуст. Использование паспорта для аутентификации. Я хочу получить зарегистрированного пользователя и отобразить его данные. Например, если я вошел в систему и если я захожу на страницу профиля, я хочу получить свои данные. В интернете было всего несколько ресурсов.
Login.js (паспорт и маршруты здесь)
var express = require('express');
var router = express.Router();
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var User = require('../models/user');
var ConnectRoles = require('connect-roles');
router.get('/', function(req, res, next) {
res.render('Login', { title: 'Login' });
});
passport.serializeUser(function(user, done) {
done(null, user._id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
passport.use("/", new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false,
{ message: "No user has that username!" });
}
user.checkPassword(password, function(err, isMatch) {
if (err) { return done(err); }
if (isMatch) {
return done(null, user);
} else {
return done(null, false,
{ message: "Invalid password." });
}
});
});
}));
router.use(function(req, res, next) {
res.locals.currentUser = req.user;
res.locals.errors = req.flash("error");
res.locals.infos = req.flash("info");
next();
});
router.post("/", passport.authenticate("/", {
successRedirect: "/SubmitSurvey",
failureRedirect: "/",
session: false,
failureFlash: true
}));
router.get("/AdminDatabase", function(req, res) {
res.render('AdminDatabase', { title: 'AdminDatabase' });
});
router.get('/CreateSurvey', function(req, res, next) {
res.render('CreateSurvey', { title: 'CreateSurvey' });
});
router.get('/SubmitSurvey', function(req, res, next) {
res.render('SubmitSurvey', { title: 'SubmitSurvey' });
});
router.get('/profile', function(req, res, next) {
res.render('profile', { title: 'profile' });
});
router.get("/Logout", function(req, res) {
req.logout();
res.redirect("/");
});
module.exports = router;
Как я могу сделать это в nodejs
3 ответа
Это на req.user
объект
router.get('/profile', function(req, res, next) {
//here it is
var user = req.user;
//you probably also want to pass this to your view
res.render('profile', { title: 'profile', user: user });
});
паспорт заполняет req.user
Объект с текущим пользователем через промежуточные программы, так что вы можете извлечь его оттуда.
Как сказал Алекс, вы можете явно передать некоторую переменную (например, ваш req.user
) при звонке res.render
:
router.get('/profile', function(req, res, next) {
res.render('profile', { title: 'profile', user: req.user });
});
Вместо этого, возможно, вы хотели бы некоторые переменные (как это req.user
) быть доступным во всех звонках res.render
не удосужившись указывать их каждый раз? В этом случае вы можете использовать res.locals
Например, добавив это промежуточное ПО:
app.use(function(req, res, next){
res.locals.user = req.user;
next();
});
И, наконец, для полноты - в обоих подходах выше переменная user
доступен для вас в представлении. Например, если вы используете шаблон pug, вы можете теперь сделать что-то вроде:
if user
p Hello, #{user.id}, good to see you!
else
p Please log in...