Подтвердить что ты не робот

NodeJS + 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 - undefined.
Если я переведу определение промежуточного программного обеспечения сеанса - все работает, но я вижу, что сеансы создаются при вызове /path 1 (этого я хочу избежать)

Может кто-нибудь объяснить, как одно приложение может использовать сеанс только в некоторых маршрутах.

Спасибо!

/////UPDATE//////

После того, как я выкапывал, я понял:

Не использовать: 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 */  
});
4b9b3361

Ответ 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
});

Чуть проще, чем ответ, включенный в обновление (вам не нужна функция обертки).

Ответ 2

Проблема - это ваш маршрут для /path1, который определен до использования express.session.

Когда вы объявляете обработчик маршрута в Express, в этот момент промежуточное ПО router (которое обрабатывает все маршруты) будет вставлено в цепочку промежуточного программного обеспечения. Это означает, что если у вас еще нет app.use 'd любого промежуточного программного обеспечения, которое будет использоваться будущими маршрутами (например, ваш обработчик для /path2), они никогда не будут вызваны при обработке любого маршрута.

Если вы переместите обработчик для /path1 после app.use(express.session(...)), он будет работать, не прибегая к трюкам.