我有一个带有一些路由的Express应用程序,其中只有两个需要支持会话。 我到处读到中间件定义(app.use(express.session({...)仅适用于它之后的路由,所以我创建了这个样本:
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);
但这不起作用:/ path2 res.session未定义。
如果我移动会话中间件定义 - 一切正常,但我看到在调用/ 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 */
});
答案 0 :(得分:25)
请勿使用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
});
比更新中包含的答案稍微简单一些(您不需要包装函数)。
答案 1 :(得分:0)
问题实际上是/path1
的路线,在使用 express.session
之前定义了。
当您在Express中声明路由处理程序时,此时router
中间件(处理所有路由)将插入到中间件链中。这意味着如果你还没有app.use
'将来的路由将使用的任何中间件(比如/path2
的处理程序),它们将永远不会在处理任何路由时被调用。
如果您将/path1
的处理程序移至app.use(express.session(...))
之后,则无需借助技巧即可使用。