【问题标题】:Socket.io for checking updates from database用于检查数据库更新的 Socket.io
【发布时间】:2013-05-04 14:24:02
【问题描述】:

我有一个 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
      }
    });
  });
});

【问题讨论】:

  • 您好,您的问题解决了吗?如何?谢谢。

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


【解决方案1】:

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

【讨论】:

  • 这真是太棒了!与 MySQL 相比,使用 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 模块与之通信。阅读此reference

【讨论】:

  • 我想到了这一点,但是有没有办法在将行插入表中时准确地通知客户端,而不是服务器检查数据库?意思是,是否有某种机制,当在表中插入一行时,会向服务器发送通知,然后服务器又会向客户端发送通知?
  • @user791345 我认为您应该使用带有快速 node_redis 客户端的 redis 实现消息队列。它具有内置的 pubsub 语义。
  • 你能提供更多细节吗?抱歉,我是 node 及其模块的新手。
  • @user791345 查看redis.io Redis 是快速的 NoSQL 键值存储,可用于组织快速消息队列。使用 node_redis (github.com/mranney/node_redis) npm 模块与之通信。阅读此参考资料stackoverflow.com/questions/4441798/…
  • 我认为每5秒查询一次是没有效果的。 signalrjs 应该更有效。 npmjs.com/package/signalrjs
猜你喜欢
  • 2013-03-05
  • 2012-08-02
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 2011-09-28
  • 1970-01-01
  • 2019-11-03
相关资源
最近更新 更多