2013-04-08 41 views
17

我有一些Express路由应用,只有两个需要支持会话。 我阅读无处不在的中间件定义(app.use(express.session({...)只适用于它之后而来的路线,所以我创造了这个示例:NodeJS + Express - 将会话中间件应用到某些路由

var express = require('express'); 
var app = express(); 
app.use(express.bodyParser()); 

app.get('/path1', function (req, res) { 
    res.send('text response'); 
}); 


app.use(express.cookieParser()); 
app.use(express.session({ 
    secret: 'secret', 
    cookie: { maxAge: new Date(Date.now() + 2 * 60 * 1000) } 
})); 


app.get('/path2', function (req, res) { 
    res.session.test = { "test": "test" }; 
    res.send('text response'); 
}); 

app.listen(8088); 

但这并不工作:in/path2 res.session是未定义的
如果我将会话中间件定义向上 - 一切正常,但我看到正在创建会话时调用/ path1(这是我想要避免的)

有人可以解释一个单个应用程序可以使用会话中只有某些路线

谢谢!

///// UPDATE //////

更多挖后 - 我想通了:

不要使用:app.use(express.session({ ... }));
相反 - 定义如下:

var sessionMiddleware = express.session({ 
    //session configurations 
}); 

function sessionHandler(req, res, next) { sessionMiddleware(req, res, next); } 

然后应用处理器上的特定路由/ s的需要会话支持:

app.get('/path_that_need_session', sessionHandler, function (req, res) {      
/* Do somthing with req.session */ 
}); 
+1

为了让你的答案更加清晰,为什么不把它写成答案并接受答案(没关系)。对于我将会话隔离到某些路线非常有效。谢谢。 – 2013-06-06 18:45:35

回答

22

请勿使用app.use(express.session({ ... }))

取而代之,初始化会话中间件,保存对结果函数的引用,然后将其直接包含在您希望的路由中。

var express = require('express'), 
    app = express(); 

var session = express.session({ 
    //session configuration 
}); 

app.use(app.router); 


// must come after app.use(app.router); 
app.get('/your/route/here', session, function(req, res){ 
    // code for route handler goes here 
}); 

稍微比包含在更新中的答案(你不需要包装函数)更简单。

+0

谢谢!这正是我最终做的。 – alonkad 2014-04-06 08:27:49

0

该问题实际上是您的路线/path1,其定义为之前express.session正在使用。

当您在Express中声明路由处理程序时,此时router中间件(它处理所有路由)将被插入到中间件链中。这意味着如果你还没有将要被未来路由使用的任何中间件(例如你的/path2的处理程序),它们在处理任何路由时都不会被调用。

如果您将/path1的处理程序移动到app.use(express.session(...))之后,它将工作而无需诉诸技巧。

+0

如果我将/ path1路径移动到'app.use(express.session(...))'之后 - 它将使用会话(这是我想要避免的)。 – alonkad 2013-04-09 07:16:57

+0

我只希望/ path2使用会话(它仅用于第一次身份验证)。/path1更广泛地使用,不需要会话 - 所以我想节省会话开销(我将它们保存在数据库中) – alonkad 2013-04-09 07:23:27

+0

够公平的。我认为你实际上可以忽略'sessionHandler'函数,因为所有这些都是将参数委托给'sessionMiddleware'(所以你可以直接使用它)。 – robertklep 2013-04-09 07:30:28

相关问题