2012-08-06 83 views
7

我想合併express.js和socket.io會話。下面是我的代碼(socket.io部分)合併socket.io和express.js會話

var io = require('socket.io').listen(app); 
io.set('log level', 1); 

io.sockets.on('connection', function (socket) { 
    console.log('client connected'); 
client.send(client.id);//send client id to client itself 
socket.on('connect', function(){ 
    console.log(socket.id + ' connected'); 
}); 
socket.on('disconnect', function(){ 
    console.log(socket.id + ' disconnected'); 
}); 
}); 

我express.js會話設置:

app.configure(function() { 
    //app.use(express.logger()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.static(__dirname + '/static')); 
    app.use(express.cookieParser()); 
    app.use(express.session({store: MemStore({ 
    reapInterval: 60000 * 10 
    }), secret:'foobar', key: 'express.sid' 
})); 

我的主要問題是在我的終端,當用戶從一個URL到另一個,會話ID傳播也有變化:但我不希望它被改變。

info - socket.io started 
client connected 
client connected 
4Z0bYHzfWCEFzbbe4WUK disconnected 
e_uSvxhSLbLAC9-F4WUL disconnected 
client connected 
bKDy90gsrWWTRJDD4WUM disconnected 
client connected 
RJ5qqCL2wfmXbd7U4WUN disconnected 
client connected 
wjN5Sqx4rucRtWL_4WUO disconnected 

回答

6

您正在輸出套接字ID,而不是來自express.js的會話ID。

您必須使用authorization事件,其第一個參數是一個對象,其中包含一個名爲sessionID的條目。該值不應該在頁面重新加載之間改變,因爲它存儲在cookie(或redis數據庫或其他)中。

這是一篇很好的文章,解釋它是如何工作的:http://www.danielbaulig.de/socket-ioexpress/,但它有點過時。基本原則保持不變,但一些細節已經改變。例如,他創建服務器的方式不再適用,連接開發人員已刪除parseCookie()。用戶not happy這一決定,但解決辦法是這樣的容易記住的代碼行:

connect.utils.parseSignedCookies(cookie.parse(decodeURIComponent(data.headers.cookie)), secret); 

正如我所說的,上面提到的文章應該給你你需要的所有基本知識,如果你想看到工作的實施,來看看這個:https://github.com/vortec/lolbr/blob/master/lib/lolbr.js

裏面的authorization事件處理程序,您可以修改data對象並使用socket.handshake日後訪問它,你的情況:socket.handshake.sessionID

希望有所幫助。

+0

連接在您的示例中未定義。任何想法解決? – Yagiz 2012-08-06 14:44:37

+0

@Alex如果你克隆了''lolbr'',確保你在它下面安裝了'express'。只需克隆,然後輸入''cd''並鍵入''npm install''。這應該工作。 – Fabian 2012-08-06 14:48:40

+0

因此,parseSignedCookies現在不可用。你如何建議重新編寫代碼?我不熟悉socket.io中的Cookies,但我發現「var cookies = cookie.parse('foo = bar; cat = meow; dog = ruff');」例。我應該如何實現這個例子? – Yagiz 2012-08-06 15:22:08