我使用express(node.js)+ mongodb在单个Heroku dyno上实现了一些用户身份验证,一切正常。但是,当我增加dynos的数量(超过1)时,我无法登录,我一直被重定向到我的登录页面,这意味着我的会话尚未设置。这是我的代码:
checkCookies = function(req,res,next){
if(req.session.user){
res.locals.user = req.session.user;
next();
}
else{
res.redirect('/login');
}
};
app.use(express.cookieParser());
app.use(express.session({ secret: '0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK',
cookie: {httpOnly: true, maxAge:14*24*60*60*1000}
}));
使用mongodb处理express / node.js上的共享会话的最佳解决方案是什么?
答案 0 :(得分:5)
使用带快递的connect-mongo模块。
var http = require('http'),
express = require('express'),
session = require('connect-mongo')(express)
然后在您的工作人员设置会话中进行外部存储。下面的代码将使用来自mongo,cookies和额外标头的会话,以允许跨域和jsonp。
app.configure(function() {
app.use(express.cookieParser());
app.use(express.session({
store: new session({
db: 'sessions'
}),
secret: 'yoursecret',
cookie: {
path: '/',
maxAge: 1000 * 60 * 60 * 24 // 1 day
}
}));
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
next();
});
app.set('jsonp callback', true);
});
答案 1 :(得分:4)
connect-mongo应该满足您的需求:https://github.com/kcbanner/connect-mongo
答案 2 :(得分:4)
上述答案具有误导性,因为它们暗示您无法在Heroku上的多个dynos上共享基于cookie的会话。
如果我使用cookie-session而不是express-session,我可以在多个dynos中使用基于Cookie的会话。此线程中第一篇文章中缺少的是秘密值未传递给cookie解析器。这意味着每次进程重新启动或新dyno旋转时,节点都会为解析器分配一个随机哈希值。
为我做以下工作:
app.use(express.cookieParser('0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK'));
app.use(express.session({ secret: '0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK',
cookie: {httpOnly: true, maxAge:14*24*60*60*1000}
}));
答案 3 :(得分:0)
对于正在寻找快速复制/粘贴解决方案的人,如果要对其进行一些更新,则基本上可以点击上面发布的Dan链接,或者只使用下面的我的代码段:
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var mongoose = require('mongoose'); // if using mongoose
mongoose.connect(connectionOptions); // if using mongoose
app.use(cookieParser());
app.use(session({
store: new MongoStore({mongooseConnection: mongoose.connection}),
secret: '0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK',
cookie: {
path: '/',
maxAge: 1000 * 60 * 60 * 24 // 1 day
}
}));