私は、クライアントからのリッスンを受信したサーバーでセットアップを行い、リアルタイムの通知を送信します。サーバーのコードは次のようになります。通知は、DBから出るたびリフレッシュするたびにsocket.io接続に別のリスナーが追加されます
var io = require('socket.io').listen(8888);
io.sockets.on('connection', function (socket) {
\t socket.emit('connected', { connected: true });
\t console.log("New user " + socket.id);
\t socket.on('ready for data', function (data) {
\t pg_client.on('notification', function(content) {
socket.broadcast.to('ROOM').emit('update', content)
});
});
});
\t \t \t
、ROOM
内のすべてのクライアントは、メッセージが表示されます。これはうまくいきますが、クライアントがページを更新すると、今度は2回リッスンして、更新ごとに2つの通知を受け取ります。 socket.id
は追加されますが、決して遠ざかりません。ここでは、クライアントコードは次のとおりです。
var socket = require('socket.io-client')('http://IP:8888')
socket.on('connected', function (data) {
\t socket.emit('ready for data', {});
});
// Triggered by an addChannel function
socket.emit('add room', {room: 'ROOM'})
socket.on('update', function(data) {
// This gets hit multiple times per update, depending on the number of client refreshes
})
私は運と、クライアントとサーバ側の両方にon
ためonce
を代入しようとしました。これが通ってくるための唯一の最初の更新を引き起こし、ノー他人
これは、コールバックの外側に 'ソケット 'が存在しないため、'ソケットが定義されていません'というエラーにつながります。編集:接続されたすべてのクライアントを繰り返し行う可能性がありますが、私は何かが不足していない限り、これはsocket.ioとトリッキーです。 –
@BonnieScott - 'socket.broadcast.to()'を 'io.to()'に変更します。 – jfriend00
ありがとうございます。これは今完全な検証を行っているようです... –