首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NodeJS + Express -将会话中间件应用于某些路由

NodeJS + Express -将会话中间件应用于某些路由
EN

Stack Overflow用户
提问于 2013-04-08 18:55:13
回答 2查看 13.2K关注 0票数 22

我有一个带有一些路由的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 */  
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-05 23:12:42

不要使用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
});

比更新中包含的答案稍微简单一些(您不需要包装器函数)。

票数 30
EN

Stack Overflow用户

发布于 2013-04-08 21:23:39

问题实际上是您在使用express.session之前定义的/path1路由。

当您在Express中声明路由处理程序时,router中间件(处理所有路由)将被插入到中间件链中。这意味着,如果您还没有app.use任何将被未来路由使用的中间件(比如您的/path2处理程序),那么在处理任何路由时,它们将永远不会被调用。

如果您将/path1的处理程序移动到app.use(express.session(...))之后,它将工作,而不必求助于技巧。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15877342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档