Socket.io для проверки обновлений из базы данных

У меня есть сервер 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
      }
    });
  });
});

Ответ 1

Если вы не хотите делать какие-либо опросы в базе данных, вы можете использовать базу данных postgresql, которая поддерживает прослушивание/уведомление. Вы будете уведомлены немедленно, если в таблице есть изменения.

Пример внедрения

Ответ 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 для связи с ним. Прочтите эту ссылку