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

时间:2013-05-10 00:05:20

标签: mysql ajax node.js socket.io real-time

我有一个连接到mysql数据库的node.js服务器,并使用socket.io打开一个新的套接字。此服务器的作用基本上是在数据库表中有该用户的新消息时通知连接到它的任何客户端(用户)。以下代码仅在客户端明确发出'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
      }
    });
  });
});

2 个答案:

答案 0 :(得分:2)

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

以下代码每隔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
      }
    });
  });
});

作为替代方式,我认为您可以使用redis与快速node_redis客户端实现消息队列。它有内置的pubsub语义。

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

答案 1 :(得分:2)

如果您不想对数据库进行任何轮询,可以使用支持listen / notify的postgresql数据库。 当表格中有修改时,您将立即收到通知。