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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (108)

我有一些Express路线的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);

但是这不起作用:in / 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 */  
});
提问于
用户回答回答于

不要使用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中间件(处理所有路由)将被插入到中间件链中。这意味着,如果你还没有app.use任何中间件将被未来路线使用(如你的处理程序/path2),它们在处理任何路线时都不会被调用。

如果你把你的处理程序/path1移到后面app.use(express.session(...)),它就可以工作。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励