控制会话以express和连接中间件开始

有一种方法来控制会话何时开始连接的会话中间件?

例如,如果我有快速应用程序configuration:

var app = express(); app.configure(function(){ app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser('secret')); app.use(express.session({ store:sessionStore, ... })); }); 

然后在每个请求中,如果没有给出会话cookie,则启动一个会话。 如果我只想在用户通过身份validation时才开始会话,该怎么办?

例如,说我有两个路线/protected/login

  • 如果有人点击/protected没有会话cookie,中间件将不会启动一个新的会话。 ( req.sessionnull
  • 如果有人点击/protected会话cookie,中间件将检查 cookie是否存在匹配的活动会话并设置req.session ,但不会启动新的会话。 ( req.session可以有一个值或为null
  • 如果有人用正确的参数点击/login ,则显式启动一个会话,然后只设置一个cookie。

开始会议的唯一方法应该是明确的:

 app.post('/login', function(req, res, next) { // connect to database and validate user... db.authenticate( req.body.user, req.body.pass, function(allow) { if (allow) { // START SESSION HERE // this will send set the cookie } }); } 

现有的连接会话中间件有没有办法实现这一点?

你想要做的是删除这一行:

 app.use(express.session({ store:sessionStore, ... })) 

现在会话默认是禁用的,取决于哪个控制器将使用它们:

 var useSessions = express.session({ store:sessionStore, ... }); var preCb = function (req, res, next) { // authenticate and stuff // .... if (authenticated === true) { next(); } }; app.post('/login', useSessions, function(req, res, next) { ... }); app.post('/protected', preCb, useSessions, function(req, res, next) { ... }); 

即使每次开始一个会话,它也没有关系,因为它是空的。 如果您试图使用它来validation访问(这似乎是这种情况),最简单的解决scheme是在您的会话中设置一个属性(如req.session.authenticated = true;),并检查。 这种方式技术上来说,访问者有一个会话,但是只有当req.session.authenticated == true时才会使用会话。 这可能不是你正在寻找的东西,但它是完成这个任务的最简单的方法。