Node.js / Express:在数据库连接和会话设置之后设置路由

时间:2014-10-15 18:07:53

标签: node.js mongodb session express

我想将会话存储在mongo的sessions集合中,以使它们在服务器重启时保持不变。

我在理解如何构建应用程序以使用express-sessionconnect-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;

使用 routes / 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 个答案:

答案 0 :(得分:1)

mongoose和mongo-session-store的设置应如下:

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);

首先,require初始设置后express-session没有必要 - 您可以将其从路由器中删除。我相信您面临一个糟糕的定时情况,即您的回调发布在中间件的其他部分之前,或者您的身体和Cookie解析器订购错误。 app.listen()应该是最后发生的事情。

这是关于此主题的另一个tutorial