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

nir*_*avb 11 mysql ajax real-time node.js socket.io

我有一个连接到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
      }
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

zav*_*avg 3

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

下面的代码每 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
      }
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

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

看看 Redis。它是快速的 NoSQL 键值存储,可用于组织快速消息队列。使用node_redis npm模块与其进行通信。阅读此参考资料

  • 我想到了这一点,但是有没有办法在行插入表中时准确通知客户端而不是服务器检查数据库?意思是,是否存在某种机制,当在表中插入一行时,会向服务器发送通知,然后服务器又将通知发送回客户端? (2认同)