2013-04-08 66 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); 

但這並不工作:in/path2 res.session是未定義的
如果我將會話中間件定義向上 - 一切正常,但我看到正在創建會話時調用/ path1(這是我想要避免的)

有人可以解釋一個單個應用程序可以使用會話中只有某些路線

謝謝!

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

更多挖後 - 我想通了:

不要使用:app.use(express.session({ ... }));
相反 - 定義如下:

var sessionMiddleware = express.session({ 
    //session configurations 
}); 

function sessionHandler(req, res, next) { sessionMiddleware(req, res, next); } 

然後應用處理器上的特定路由/ s的需要會話支持:

app.get('/path_that_need_session', sessionHandler, function (req, res) {      
/* Do somthing with req.session */ 
}); 
+1

爲了讓你的答案更加清晰,爲什麼不把它寫成答案並接受答案(沒關係)。對於我將會話隔離到某些路線非常有效。謝謝。 – 2013-06-06 18:45:35

回答

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 2014-04-06 08:27:49

0

該問題實際上是您的路線/path1,其定義爲之前express.session正在使用。

當您在Express中聲明路由處理程序時,此時router中間件(它處理所有路由)將被插入到中間件鏈中。這意味着如果你還沒有將要被未來路由使用的任何中間件(例如你的/path2的處理程序),它們在處理任何路由時都不會被調用。

如果您將/path1的處理程序移動到app.use(express.session(...))之後,它將工作而無需訴諸技巧。

+0

如果我將/ path1路徑移動到'app.use(express.session(...))'之後 - 它將使用會話(這是我想要避免的)。 – alonkad 2013-04-09 07:16:57

+0

我只希望/ path2使用會話(它僅用於第一次身份驗證)。/path1更廣泛地使用,不需要會話 - 所以我想節省會話開銷(我將它們保存在數據庫中) – alonkad 2013-04-09 07:23:27

+0

夠公平的。我認爲你實際上可以忽略'sessionHandler'函數,因爲所有這些都是將參數委託給'sessionMiddleware'(所以你可以直接使用它)。 – robertklep 2013-04-09 07:30:28

相關問題