これはかなり新しいので、これは完全に間違ったアプローチですが謝りますが、現在node.jsを使用して小さなチャットアプリケーションをプログラミングしていますexpressとsocket.ioで。私はコンソールにログインメッセージを記録することができましたが、私は本当にログアウトと苦労しています。ここに示すように、ユーザが、私はクッキーのうち、ユーザ名としてroomnameのaswellを取り、それをサーバーに送るページを開いたとき:その後ページを閉じた後にnode.jsにメッセージを送信する
var socket = io();
var roomname = readCookie('Roomname');
var nickname = readCookie('Nickname');
var data = {'type': 'user', 'channel': roomname, 'user': nickname, 'data': "joined"};
socket.emit('chat', data);
私は、サーバー側でメッセージをフィルタリングし、解答を送信します私は常に文字列を送信
case 'user':
io.emit('chat/' + msg.channel, {type: 'user', user: msg.user, data: msg.data});
break;
ので、右の部屋にいるユーザーのみがメッセージを見ることができるチャンネル名としてroomname続く「チャット」:このようなすべてのクライアントに。その後、私はクライアント側で受信したメッセージの種類を整理:ユーザーがそうページを閉じたら
case 'user':
console.log(msg.user + " just " + msg.data + " the room!");
break;
は、今私がする必要がある唯一のものは、何らかの形でサーバ側にルーム - とユーザー名を取得しています私はメッセージを送信することができますが、 "左"。
var data = {'type': 'user', 'channel': roomname, 'user': nickname, 'data': "left"};
socket.emit('chat', data);
私のアプローチは、適切なタイミングでコードを発射イベントを見つけることだったと私は今、良い時間のため、スタックオーバーフローを見てきたと私はちょうど仕事をした何かを見つけることができませんでした(このような) 。私は見つけることができるwindow.onbeforeunload
のすべてのバリエーションを試しましたが、どれもうまくいかなかったようです。私はいくつかのものをコンソールに記録することができましたが、サーバー側には決してメッセージを出すことはできませんでした。私はそれが私がそれを望む方法では不可能かもしれないことを知っていますが、私は実際に次に試すものを考えなくなりました。誰かが私を助けることができますか?
クライアントが消えたとき、あなたは確実に知ることはできません。これを行う正しい方法はタイムアウトシステムです。 – Pointy
@Pointyそれはとても悲しいです!なぜなら、サーバ側では、 'socket.on( 'disconnect'、myFunction();)' を使用してサーバ側でこれを行うことができるからです。私の問題は、 。もし私がそれを正しく取得したら、私は放射して、ある種の「やあ、私はまだここにいる」というメッセージをチェックすることを薦めます。右? – Lumination
はい、そのようなもの、またはユーザーから実際のメッセージを受け取るたびにリセットする単純なタイマーです。あなたがそれについて考えると、ユーザーがブラウザタブを閉じるか、コンピュータをオフにすることは、立ち上がって夕食に出かけるだけのユーザーとあまり変わりません。 – Pointy