2015-11-16 31 views
0

我走了幾步到socket.io。沒有req就很難編碼,因爲我不知道對誰的迴應。如何在特定事件後通過socket.io將消息發送到特定的登錄用戶?

對於這個問題。我的網站有一些博客。當博客更新時,我需要「告訴」那些關注博客的用戶,博客已經更新。問題是我不知道巫婆跟隨用戶在線,我不知道如何發射事件給他們只有後面的用戶ID。

有人能給我一些提示嗎?不需要任何特定的代碼。

回答

0

您可以使用cookie將http請求映射到相應的套接字連接。可以說我們正在使用Cookie sesson-id。 通過http請求在客戶端上放置此cookie。

在下面的代碼修補程序中,在創建新的套接字連接之前,您會將session-id cookie附加到套接字標頭。這樣,您就可以在.on("connection")事件訪問此session-id

var io = require("socket.io"); 
    sio = io.listen(server); 
    sio.set("authorization", function (data, accept) { 
    if (data.headers.cookie) { 
     data.cookie = cookie.parse(data.headers.cookie); 
     data.headers.sessionID = data.cookie["session-id"]; 
    } 
    accept(null, true); 
    }); 

接下來,存儲相關聯的session-id插座連接對象:

var sockets = {}; // store all socket connections here 
    sio.sockets.on("connection",connected); 
    function connected(socket){ 
     var sessionID = socket.handshake.headers.sessionID; 
     sockets[sessionID] = socket; 
    } 

現在,每當你想發出與特定插座事件http請求:

function dummyReq(req,res){ 
    var session_id = // get cookie from req 

    //after certain actions 
     sockets[session_id].emit("dummy-event","dummy-message"); 
    } 

在你的情況下,你將不得不發射所有插座事件session-id l簽署給用戶誰是以下這些博客

+0

感謝您的回覆。我雖然這樣,但最後,我放棄了,因爲這太複雜了。之後,我挖掘出一些有趣的變數。我可以通過「io.sockets.sockets [i] .request.session」獲得會話值。 PS:io.set函數已被棄用,我們應該使用io.use中間件。 – JamesYin

0

您可以撥打join到插座訂閱指定通道:

io.to('some room').emit('some event'); 

要:

io.on('connection', function(socket){ 
    socket.join('some room'); 
}); 

,然後簡單地廣播或發射時使用to留下頻道,您需要致電leave

io.on('disconnect', function(socket){ 
    socket.leave('some room'); 
}); 
相關問題