2011-08-11 45 views
0

我試圖從由Node.js服務器使用Express.js框架觸發的'升級'事件訪問會話對象。我已經正確設置了會話支持,並且可以從標準.get .post .put和.delete方法訪問它,例如。Node.js + Express.js(連接) - 從'升級'事件訪問會話

app.get('/', function(req, res) { 
    req.session.test = 'Hello world'; // Works fine 
    res.render('index'); 
}); 

但如果我勾了一個關於「升級」事件的服務器上,像這樣:

app.on('upgrade', function(req, socket) { 
    var message = req.session.test; // Doesn't work 
}); 

我無法訪問會話對象。就我所知,連接會話中間件僅掛接get/post/put/delete方法的會話,但不掛接'upgrade'等自定義事件。我試圖從最初的WebSocket握手訪問會話。我想在WebSocket握手期間從客戶端發出'升級'事件。會話cookie肯定是有在握手例如在HTTP標頭:

app.on('upgrade', function(req, socket) { 
    var cookieHeader = req.headers['cookie']; 
    console.log(cookieHeader); 
}); 

...將輸出連接會話cookie。是否有可能使用原始會話cookie令牌手動構建會話對象?


更新:一直講要到一些人對Node.js的IRC聊天室,顯然這是要麼非常difficalt或不可能的。 Connect中間件不會暴露於自定義/異常事件,如「升級」。他們說,以提高在Github上的問題,所以在這裏它是:

https://github.com/senchalabs/connect/issues/342

回答

1

既然你沒有訪問響應對象,你應該能夠通過獲取會話存儲查找會話對象並使用您從cookie獲得的session_id呼叫get(session_id, callback)。如果req對象已鏈接到req.res(其中express.js會爲您執行),但如果這是一個原始node.js事件,那麼您也可能實際調用普通會話中間件功能,則該連接目前可能還沒有制定。在創建中間件時,您必須手動創建會話Store實例並保存對其的引用,然後將其傳遞給options對象中的會話中間件工廠函數。

+0

我可能會嘗試使用會話存儲創建會話,如您所建議的。但是這個事件在node.js級別上已經有了。 –