Как выставить переменные сеанса для выражения просмотров
Я пытаюсь получить доступ к переменным сеанса в представлениях EJS, но сталкиваюсь с множеством проблем.
Для локального доступа к req.session я использую промежуточное программное обеспечение, как описано здесь. Доступ к req или сеансу Express.js из шаблона Jade
var express = require('express');
var mongoose = require('mongoose');
var db = require('./models/db.js');
var routes = require('./routes/route.js');
var user = require('./routes/user.js');
var story = require('./routes/story.js');
var bodyParser = require('body-parser');
var session = require('express-session');
var cookieParser = require('cookie-parser');
mongoose.connect('mongodb://localhost/test');
var app = express();
app.use(function(req,res,next){
res.locals.session = req.session;
next();
});
app.set('view engine','ejs');
app.use(express.static(__dirname + '/public'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:false}));
app.use(cookieParser());
app.use(session({secret:"qazwsxedcrfvtgbyhnujm"}));
app.get('/',routes.home);
app.get('/register',routes.register);
app.post('/newUser',user.doCreate);
app.get('/login',routes.login);
app.post('/authenticate',user.login);
app.get('/new-story',routes.newStory);
app.post('/add-story',story.addStory);
app.get('/stories/:story',story.getStory);
app.post('/stories/:slug/saveComment',story.saveComment);
var port = process.env.PORT || 3000;
var server=app.listen(port,function(req,res){
console.log("Catch the action at http://localhost:"+port);
});
Вот route.js для обработки домашнего маршрута
var mongoose = require( 'mongoose' );
var Story = mongoose.model( 'Story' );
exports.home=function(req,res){
Story.find({}, function(err,stories){
res.render('home',{stories:stories});
});
}
В home.ejs я проверяю, вошел ли пользователь в систему или заметил, проверил, установлено ли свойство username или нет.
<% if( typeof(session.username) !== 'undefined' ) {%
<h1>Welcome</h1><%=session.username%>
<%}%>
Но при доступе к главной странице я получаю сообщение об ошибке " Не удается прочитать свойство" имя пользователя "с неопределенной ошибкой"
Я устанавливаю имя пользователя в сеансе, как только пользователь аутентифицирован.
exports.login=function(req,res){
var email=req.body.email;
var password=req.body.password;
User.findOne({email:email}, function(err,user){
if(err){
res.redirect("/login");
}
user.comparePassword(password,function(err,isMatch){
if(isMatch && isMatch==true){
console.log("Authentication Sucessfull");
req.session.username=user.username;
console.log("Got USer : "+req.session.username);
res.redirect("/");
}else{
console.log("Authentication UnSucessfull");
res.redirect("/login");
}
});
});
}
1 ответ
Express запускает промежуточное ПО в порядке их объявления.
У вас есть это:
app.use(function(req,res,next){
res.locals.session = req.session;
next();
});
...
app.use(session({secret:"qazwsxedcrfvtgbyhnujm"}));
Ваше промежуточное программное обеспечение запускается до промежуточного программного обеспечения сеанса (оно объявлено перед ним), поэтому вы создаете res.locals.session
до того, как промежуточное ПО сеанса получит шанс создать req.session
,
Попробуйте переместить ваше промежуточное ПО в промежуточное ПО после сеанса:
app.use(session({secret:"qazwsxedcrfvtgbyhnujm"}));
app.use(function(req,res,next){
res.locals.session = req.session;
next();
});