Как выставить переменные сеанса для выражения просмотров

Я пытаюсь получить доступ к переменным сеанса в представлениях 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();
});
Другие вопросы по тегам