こんにちは私はチャットをアプリケーションに組み込むことを試みています。私が疑問に思っているのは、ユーザーがWebサイトからログアウトしたときに、そのセッションに関連付けられたsocket.ioハンドシェイクを破棄して、ユーザーがログアウトしたときに別のタブからメッセージを送信できないようにするにはどうすればよいかということです。
それが助けになるなら、私はexpressjsを使用しています。
誰かがこれを見つけて、私がそれを理解したことを知りたい場合に備えて。ソケット切断機能にアクセスできます。私はユーザーIDとそのソケットIDのオブジェクトを持っていたので、誰かがログアウトしたときに電話をかけました
app.get("/logout", function(req,res){
//do other logging out stuff
sockets.disconnectUser(req.session.user_id);
}
// Disconnect User function
sockets.disconnectUser = function(user_id){
sockets.socket(users[user_id]).disconnect();
}
socket.ioオブジェクトには、接続されているすべてのソケットと各ソケットのsessionIDに関する情報が含まれています。したがって、接続されたソケットを反復処理し、ログアウトしているsessionIDに関連付けられているソケットを切断することができます。このアプローチでは、ユーザーIDとソケットIDを手動で追跡する必要はありません。
socket.io@2.2.0、express@4.17.1およびexpress-session@1.16.2でテストされたサンプルコード。
const SocketIO = require('socket.io');
let sio = new SocketIO;
app.get('/logout', function(req, res) {
//do other logging out stuff
logoutSocketsIO(req.sessionID);
});
// Iterate through all connected sockets and close those which are associated
// with the given sessionID
// Note: One sessionID can have multiple sockets (e.g. many browser tabs)
function logoutSocketsIO(sessionID) {
let connections = sio.sockets.connected;
for(let c in connections) {
let socketSessionID = connections[c].conn.request.sessionID;
if(sessionID === socketSessionID) {
connections[c].disconnect();
}
}
}