NodeJS + Express – 将会话中间件应用于某些路由

我有一个快速的应用程序与一些路线,只有两个需要支持会议。 我到处读到中间件定义(app.use(express.session({…)仅适用于后面的路由,所以我创build了这个示例:

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是未定义的。
如果我移动会话中间件定义 – 一切正常,但我看到正在创build会话正在调用/ path1(这是我想要避免)

有人可以解释一个单一的应用程序如何可以在一些路线中使用会话。

谢谢!

/////更新//////

经过更多的挖掘 – 我明白了:

不要使用: app.use(express.session({ ... }));
相反,请定义以下内容:

 var sessionMiddleware = express.session({ //session configurations }); function sessionHandler(req, res, next) { sessionMiddleware(req, res, next); } 

然后在需要会话支持的特定路由上应用处理程序:

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

不要使用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 }); 

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

问题实际上是你的路由/path1 ,它是 express.session被使用之前定义的。

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

如果将/path1的处理程序移动到app.use(express.session(...)) ,它将无需使用技巧。