我想将会话存储在mongo的sessions
集合中,以使它们在服务器重启时保持不变。
我在理解如何构建应用程序以使用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;
使用 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,这似乎很有效。我将等待一段时间以防这个问题中的实际问题得到解决,否则我会将其标记为已回答。
答案 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。