2013-05-10 7 views
10

Ich habe einen node.js-Server, der eine Verbindung zu einer MySQL-Datenbank herstellt und einen neuen Socket mit socket.io öffnet. Die Rolle dieses Servers besteht im Wesentlichen darin, jeden Client (Benutzer) zu benachrichtigen, der eine Verbindung herstellt, wenn eine neue Nachricht für diesen Benutzer in der Datenbanktabelle vorhanden ist. Der folgende Code funktioniert nur, wenn der Client explizit eine Anforderung 'check_messages' ausgibt. Wie kann ich das ändern, so dass der Client derjenige ist, der benachrichtigt wird, wenn eine neue Nachricht in die mysql-Tabelle für diesen Benutzer eingefügt wird, anstatt dass der Client explizit eine Anfrage 'check_messages' ausgeben muss?Socket.io zum Überprüfen von Updates aus der Datenbank

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

Hallo, Hat Ihr Problem gelöst? Und wie? Vielen Dank. – diligent

Antwort

1

Sie können Ihren Code im Event-Handler des Timers auf dem Server ausführen.

Der folgende Code überprüft Datenbank für neue Nachricht für alle 5 Sekunden und emittiert Ereignis ggf.

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 
     } 
    }); 
    }); 
}); 

Als alternative Möglichkeit, ich glaube, Sie Nachricht implementieren könnte mit redis mit dem schnellen node_redis Client Schlange stehen. Es hat eine eingebaute Pubsub-Semantik.

Betrachten Sie Redis. Es ist ein schneller NoSQL-Schlüsselwertspeicher, mit dem Sie schnelle Nachrichtenwarteschlangen organisieren können. Verwenden Sie node_redis Npm-Modul, um mit ihm zu kommunizieren. Lesen Sie diese reference

+2

Ich dachte darüber nach, aber gibt es eine Möglichkeit, den Client genau zu benachrichtigen, wenn die Zeile in die Tabelle eingefügt wird, anstatt dass der Server die Datenbank überprüft? Bedeutet, gibt es eine Art von Mechanismus, dass, wenn eine Zeile in der Tabelle eingefügt wird, eine Benachrichtigung an den Server gesendet wird und der Server wiederum eine Benachrichtigung an den Client sendet? –

+0

@ user791345 Ich denke, Sie sollten Message Queuing mit Redis mit dem schnellen node_redis Client implementieren. Es hat eine eingebaute Pubsub-Semantik. – zavg

+0

Können Sie weitere Details angeben? Entschuldigung, ich bin neu im Knoten und seinen Modulen. –

3

Wenn Sie keine Abfragen in der Datenbank durchführen möchten, können Sie die Postgresql-Datenbank, die Listen/Notify unterstützen. Sie werden sofort benachrichtigt, wenn eine Änderung auf dem Tisch ist.

Implementation example

+0

Das ist wirklich großartig! Gibt es irgendwelche Nachteile bei der Verwendung von Postgresql im Vergleich zu MySQL? –

Verwandte Themen