【问题标题】:NodeJS + Express - Apply session middleware to some routesNodeJS + Express - 将会话中间件应用于某些路由
【发布时间】: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 */  
});

【问题讨论】:

  • 为了让你的答案更清楚,何不把它写成答案并接受它(没关系)。这对我来说非常有效,可以将会话隔离到某些路由。谢谢。

标签: node.js session express


【解决方案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 (所以您不妨直接使用它)。
猜你喜欢
  • 2012-06-18
  • 1970-01-01
  • 2016-11-28
  • 2020-05-09
  • 2020-05-22
  • 2014-07-08
  • 2019-01-21
  • 2020-09-16
  • 2017-05-03
相关资源
最近更新 更多