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

问题描述 投票:11回答:2

我有一个连接到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
      }
    });
  });
});
mysql ajax node.js socket.io real-time
2个回答
2
投票

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

下面的代码每隔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


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.