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 中的会话处理。 CORS 问题

NodeJS express - 如何在路由器内添加会话数据?

GraphQL 订阅、websocket、nodejs、Express 会话

具有express-sessions和express-mysql-session的NodeJS没有设置会话。我搞砸了哪里?

在带有 express-session 的 NodeJS 中使用安全 cookie 时会话不持久

nodejs篇 express 中间件详解