2017-09-20 7 views
1

これはかなり新しいので、これは完全に間違ったアプローチですが謝りますが、現在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のすべてのバリエーションを試しましたが、どれもうまくいかなかったようです。私はいくつかのものをコンソールに記録することができましたが、サーバー側には決してメッセージを出すことはできませんでした。私はそれが私がそれを望む方法では不可能かもしれないことを知っていますが、私は実際に次に試すものを考えなくなりました。誰かが私を助けることができますか?

+0

クライアントが消えたとき、あなたは確実に知ることはできません。これを行う正しい方法はタイムアウトシステムです。 – Pointy

+0

@Pointyそれはとても悲しいです!なぜなら、サーバ側では、 'socket.on( 'disconnect'、myFunction();)' を使用してサーバ側でこれを行うことができるからです。私の問題は、 。もし私がそれを正しく取得したら、私は放射して、ある種の「やあ、私はまだここにいる」というメッセージをチェックすることを薦めます。右? – Lumination

+0

はい、そのようなもの、またはユーザーから実際のメッセージを受け取るたびにリセットする単純なタイマーです。あなたがそれについて考えると、ユーザーがブラウザタブを閉じるか、コンピュータをオフにすることは、立ち上がって夕食に出かけるだけのユーザーとあまり変わりません。 – Pointy

答えて

2

クライアントが最初に接続したときに、ソケットオブジェクトにクライアントのユーザー名に関する情報を追加できます。クライアントが切断すると、socket.usernameを使用することができます。

クライアント:

var socket = io(); 
var roomname = readCookie('Roomname'); 
var nickname = readCookie('Nickname'); 
socket.on('connect',() => { 
    socket.emit("hello", {nick:nickname, room:roomname}); 
}); 

サーバー:

socket.on("hello", (data) => { 
    socket.username = data.nick; 
    socket.join(data.room); 
    socket.room = data.room; 
}); 
socket.on("disconnect",() => { 
    var data = {'type':'user', 'channel':socket.room, 'user':socket.username, 'data':'left'}; 
    socket.broadcast.to(socket.room).emit('chat', data}; 
    socket.leave(socket.room); 
}); 
+0

これはまさに私が探していたものです!私はちょうど私自身でユーザー変数を作成しようとし始めましたが、別の方法が必要であることは分かっていました!私はそれを試し、結果をできるだけ早くあなたに伝えます!ありがとうございます! – Lumination

+0

これは確かに便利ですが、ユーザーが電話やコンピュータをオフにしただけでは、「切断」イベントは発生しません。 – Pointy

+0

もちろん私はします。「切断」イベントは、クライアントから受信していないサーバー側で発生します。 – mk12ok

関連する問題