2013-05-10 37 views
10

我有一個連接到mysql數據庫並使用socket.io打開一個新套接字的node.js服務器。此服務器的作用基本上是在數據庫表中存在該用戶的新消息時通知與其連接的任何客戶端(用戶)。下面的代碼僅在客戶端明確發出'check_messages'請求時纔有效。我怎樣才能改變它,這樣客戶端就會在每次在mysql表中爲該用戶插入新消息時通知客戶端,而不是客戶端必須明確發出'check_messages'請求?用於檢查數據庫更新的Socket.io

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

嗨,你的問題解決了嗎?如何?謝謝。 – diligent 2013-07-03 04:27:05

回答

1

您可以在服務器上的計時器的事件處理程序中運行您的代碼。如果必要的話

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

作爲替代方式,我認爲你可以實現信息使用與快速node_redis客戶Redis的排隊

下列檢查數據庫的代碼爲新的消息每5秒和發射事件。它具有內置的pubsub語義。

看看Redis。它是快速的NoSQL鍵值存儲,您可以使用它來組織快速消息隊列。使用node_redis npm模塊與之通信。閱讀本文reference

+2

我想到了這一點,但有沒有一種方法可以在將行插入表中而不是檢查數據庫的服務器時準確通知客戶端?也就是說,是否存在某種機制,當在表中插入一行時,會向服務器發送通知,服務器又會向客戶端發送通知? – 2013-05-10 00:26:57

+0

@ user791345我想你應該使用redis和快速node_redis客戶端來實現消息隊列。它具有內置的pubsub語義。 – zavg 2013-05-10 00:31:08

+0

你能提供更多的細節嗎?對不起,我對節點及其模塊不熟悉。 – 2013-05-10 00:38:31

3

如果您不想對數據庫執行任何輪詢,則可以使用支持listen/notify的postgresql數據庫。 當桌上有修改時,您會立即收到通知。

Implementation example

+0

這真的太棒了!使用Postgresql與MySQL相比有什麼缺點? – 2015-08-05 15:55:27