NodeJS + Express - 将会话中间件应用于某些路由
Posted
技术标签:
【中文标题】NodeJS + Express - 将会话中间件应用于某些路由【英文标题】:NodeJS + Express - Apply session middleware to some routes 【发布时间】:2013-03-30 10:20:52 【问题描述】:我有一个包含一些路由的 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 */
);
【问题讨论】:
为了让你的答案更清楚,何不把它写成答案并接受它(没关系)。这对我来说非常有效,可以将会话隔离到某些路由。谢谢。 【参考方案1】:不要使用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
);
比更新中包含的答案略简单(您不需要包装函数)。
【讨论】:
谢谢!这正是我最终所做的。 @Waylon_Flinn 我的路由结构在不同的文件中,我们如何扩展它以在不同的路由文件中公开会话?【参考方案2】:问题实际上是您对/path1
的路由,它是在使用express.session
之前定义的。
当您在 Express 中声明路由处理程序时,此时 router
中间件(处理所有路由)将被插入到中间件链中。这意味着,如果您还没有 app.use
'd 任何将被未来路由使用的中间件(例如您的 /path2
处理程序),则在处理任何路由时它们将永远不会被调用。
如果您将/path1
的处理程序移动到app.use(express.session(...))
之后,它就可以工作而无需求助于技巧。
【讨论】:
如果我将 /path1 路由移动到app.use(express.session(...))
之后 - 它将使用会话(这是我想要避免的)。
我只希望 /path2 使用会话(它仅用于首次身份验证)。 /path1 使用更广泛,不需要会话 - 所以我想节省会话开销(我将它们保存在数据库中)
很公平。我认为您实际上可以在您的情况下省略 sessionHandler
函数,因为所做的只是将参数委托给 sessionMiddleware
(所以您不妨直接使用它)。以上是关于NodeJS + Express - 将会话中间件应用于某些路由的主要内容,如果未能解决你的问题,请参考以下文章
NodeJS express - 如何在路由器内添加会话数据?
GraphQL 订阅、websocket、nodejs、Express 会话
具有express-sessions和express-mysql-session的NodeJS没有设置会话。我搞砸了哪里?