2013-04-08 3 views
17

У меня есть приложение Express с некоторыми маршрутами, только два из них должны поддерживать сеансы. я читал везде, что определение промежуточного слоя (app.use (express.session ({...) применяется только к маршрутам, что приходит после него, так что я создал этот образец:NodeJS + Express - применить промежуточное ПО промежуточного уровня к некоторым маршрутам

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 (это то, что я хочу, чтобы избежать)

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

Спасибо!

///// 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 */ 
}); 
+1

Чтобы сделать ваш ответ более понятным, почему бы не написать его как ответ и принять его (это нормально). Для меня это очень хорошо работало, чтобы изолировать сеансы до определенных маршрутов. Благодарю. –

ответ

22

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

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

+0

Спасибо! Именно это я и сделал. – alonkad

0

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

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

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

+0

Если я перемещаю маршрут/path1 после 'app.use (express.session (...))' - он будет использовать сеансы (этого я и хотел избежать). – alonkad

+0

Я хотел только/path2 использовать сеансы (он используется только для аутентификации в первый раз)./path1 более широко используется и не требует сеансов - поэтому я хотел сохранить накладные расходы на сессию (я сохраняю их в БД) – alonkad

+0

Достаточно справедливо.Я думаю, что вы действительно можете оставить функцию sessionHandler в своем случае, потому что все, что это делает, - это делегировать аргументы 'sessionMiddleware' (так что вы можете использовать это напрямую). – robertklep