2014-10-15 1 views
0

Я хочу сохранить сеансы в коллекции sessions в монго, чтобы они сохранялись при перезагрузке сервера.Node.js/Express: настройка маршрутов после подключения к базе данных и настройки сеанса

У меня возникли проблемы с пониманием того, как структурировать мое приложение для настройки управления сеансом с помощью express-session и connect-mongo.

При настройке сеансов, как показано ниже, req.session является undefined на моем маршруте.

До сих пор мои app.js выглядит следующим образом:

var express = require('express'); 
var session = require('express-session'); 
var MongoStore = require('connect-mongo')(session); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 

var myRoute = require('./routes/myroute'); 

var app = express(); 

var mongoose = require('mongoose'); 
var collection = 'kittens'; 
mongoose.connect(
    "mongodb://user_mongoadmin:blabla>@localhost:20742/"+collection, 
    {auth:{authdb:"admin"}}, 
    function(e) { 
     console.log('database connecterino'); 
     app.use(cookieParser) 
     app.use(session({ 
      secret: 'wombatlover95', 
      store: new MongoStore({ mongoose_connection: mongoose.connection }) 
     })); 

     app.listen(); 
    } 
); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(__dirname + '/public/favicon.ico')); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use('/myroute/', myRoute); 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handlers 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function(err, req, res, next) { 
     res.status(err.status || 500); 
     res.render('error', { 
      message: err.message, 
      error: err 
     }); 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: {} 
    }); 
}); 


module.exports = app; 

С маршруты/myroute.js существо:

var express = require('express'); 
var session = require('express-session'); 
var router = express.Router(); 

router.get('/', function(req, res) { 

    console.log(req.session); 
    // returns undefined 

}); 

module.exports = router; 

Я уверен, что это имеет отношение к с порядком, в котором я указываю соединение с базой данных, настройку сеанса на моих маршрутах. Но я просто не могу понять, как именно я буду структурировать свое приложение здесь.

Может ли кто-нибудь помочь мне с этим? Заранее большое спасибо!

Редактировать: Я переключился на mongoose-session, который, кажется, работает красиво. Я буду ждать некоторое время, если проблема будет решена в этом вопросе, иначе я помету ее как ответ.

ответ

1

Установка для мангустов и Монго-сессия-магазин должен быть как следует:

var session = require('express-session'); 
var bodyParser = require('body-parser'); 
var cookieParser = require('cookie-parser'); 
var connectMongo = require('connect-mongo')({ session: session }); 

    mongoose.connect('your connect'); 

    app.use(cookieParser()); 
    app.use(bodyParser.json()); 
    app.use(bodyParser.urlencoded({ extended: true })); 

    app.use(session({ 
         resave   : true, 
         saveUninitialized: true, 
         secret   : 'yourSecret', 
         store   : new connectMongo({ 
                   url   : config.mongoConnect, 
                   auto_reconnect: true 
                  }) 
        })); 
app.listen(3000); 

Прежде всего это не нужно requireexpress-session после первоначальной настройки - вы можете удалить его из маршрутизаторов. Я считаю, что вы столкнулись с плохой временной ситуацией, когда ваш обратный вызов приходит перед другой частью вашего промежуточного программного обеспечения или он плохо упорядочен с вашим телом и парсером cookie. app.listen() должно быть последним, что происходит.

Вот еще tutorial по этой теме.

+0

Большое спасибо за быстрый ответ! Однако: я не могу использовать параметр 'url' в connectMongo, потому что мне нужно подключиться к базе данных auth (см.' Mongoose.connect ("mongodb: // user_mongoadmin: blabla> @localhost: 20742 /" + collection, { auth: {authdb: "admin"}} [...]) ') – ngmir

+0

Я попытался упорядочить код, как вы предлагали, и передать существующее соединение, как я это делал раньше, с помощью' mongoose_connection: mongoose.connection', но это дает мне то же самое ошибка. – ngmir

+0

'Mongo-connect'supports auths (https://github.com/kcbanner/connect-mongo) Вы используете' mongoose_connection: mongoose.connection [0] ', как указано в документации экспресс-сессии? – staaar

Смежные вопросы