14

我有一个 node.js 服务器,它连接到 mysql 数据库并使用 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
      }
    });
  });
});
4

2 回答 2

4

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

于 2014-01-16T16:17:04.797 回答
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
      }
    });
  });
});

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

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

于 2013-05-10T00:19:38.447 回答