用于检查数据库更新的Socket.io

我有一个连接到mysql数据库的node.js服务器,并使用socket.io打开一个新的套接字。 该服务器的angular色基本上是在数据库表中有该用户的新消息时通知连接到该服务器的任何客户端(用户)。 下面的代码仅在客户端明确发出“check_messages”请求时才起作用。 我怎样才能改变它,使客户端是一个通知,而不是一个新的消息插入到该用户的MySQL表中,而不是客户端不得不明确发出'check_messages'请求?

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

如果你不想在数据库上进行轮询,你可以使用支持listen / notify的postgresql数据库。 桌子上有修改时,您会立即得到通知。

实现的例子

您可以在服务器上的计时器事件处理程序中运行您的代码。

下面的代码每5秒检查数据库中的新消息,并在必要时发出事件

 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的消息队列。 它具有内置的pubsub语义。

看看Redis 。 它是快速的NoSQL键值存储,您可以使用它来组织快速消息队列。 使用node_redis npm模块与之通信。 阅读此参考