2013-05-10 4 views
10

Ho un server node.js che si collega a un database mysql e apre un nuovo socket tramite socket.io. Il ruolo di questo server è fondamentalmente quello di notificare qualsiasi client (utente) che si connette ad esso quando c'è un nuovo messaggio per quell'utente nella tabella del database. Il codice riportato sotto funziona solo se il client emette esplicitamente una richiesta 'check_messages'. Come posso cambiarlo in modo che il client sia quello che viene notificato ogni volta che un nuovo messaggio viene inserito nella tabella mysql per quell'utente, invece che il client deve emettere esplicitamente una richiesta 'check_messages'?Socket.io per il controllo degli aggiornamenti dal database

var app = require('http').createServer().listen(8124); 

var mysql  = require('mysql'); 
var connection = mysql.createConnection({ 
    host  : 'localhost', 
    user  : 'some username', 
    password : 'some password', 
    database : 'some database' 
}); 

connection.connect(); 

console.log('Server running at http://127.0.0.1:8124/'); 

var io = require('socket.io').listen(app); 

var prev_id = 0; 

io.sockets.on('connection', function (socket) { 
    socket.emit('greeting', 'Hello'); 
    socket.on('check_messages',function(data){ 
    var uid = data['uid']; 
    var q = "SELECT * FROM messages WHERE user_id=" + uid + " ORDER BY id DESC LIMIT 1"; 
    connection.query(q, function(err, rows, fields) { 
     if (err) throw err; 
     if (rows[0].id > prev_id){ 
     socket.emit('new_message',rows[0]); 
     prev_id = rows[0].id 
     } 
    }); 
    }); 
}); 
+1

Ciao, il problema è risolto? E come? Grazie. – diligent

risposta

1

È possibile eseguire il codice nel gestore eventi del timer sul server.

Il codice qui sotto database di controlli per il nuovo messaggio per ogni 5 secondi ed emette evento, se necessario,

io.sockets.on('connection', function (socket) { 
    socket.emit('greeting', 'Hello'); 
    setInterval(5000,function(data){ 
    var uid = data['uid']; 
    var q = "SELECT * FROM messages WHERE user_id="+uid+" ORDER BY id DESC LIMIT 1"; 
    connection.query(q, function(err, rows, fields) { 
     if (err) throw err; 
     if (rows[0].id > prev_id){ 
     socket.emit('new_message',rows[0]); 
     prev_id = rows[0].id 
     } 
    }); 
    }); 
}); 

In modo alternativo Penso che si potrebbe implementare l'accodamento dei messaggi utilizzando Redis con il cliente node_redis veloce. Ha semantica di pubsub incorporata.

Vedere Redis. È l'archiviazione dei valori-chiave NoSQL veloce che è possibile utilizzare per organizzare l'accodamento rapido dei messaggi. Utilizzare il modulo nm node_redis per comunicare con esso. Leggi questo reference

+2

Ci ho pensato, ma c'è un modo per avvisare il client esattamente quando la riga viene inserita nella tabella invece del server che controlla il database? Significa, c'è una sorta di meccanismo che quando una riga viene inserita nella tabella, una notifica viene inviata al server e il server a sua volta invia una notifica al client? –

+0

@ user791345 Penso che dovresti implementare l'accodamento dei messaggi usando redis con il client node_redis veloce. Ha semantica di pubsub incorporata. – zavg

+0

Potete fornire maggiori dettagli? Scusa se sono nuovo del nodo e dei suoi moduli. –

3

Se non si desidera eseguire il polling sul database, è possibile utilizzare il database postgresql che supporta listen/notify. Sarai avvisato immediatamente quando c'è una modifica sul tavolo.

Implementation example

+0

Questo è davvero fantastico! Ci sono degli svantaggi nell'utilizzare Postgresql rispetto a MySQL? –