14

mysql データベースに接続し、socket.io を使用して新しいソケットを開く node.js サーバーがあります。このサーバーの基本的な役割は、データベース テーブルにそのユーザー宛ての新しいメッセージがある場合に、それに接続するすべてのクライアント (ユーザー) に通知することです。以下のコードは、クライアントが「check_messages」リクエストを明示的に発行した場合にのみ機能します。クライアントが「check_messages」リクエストを明示的に発行する代わりに、そのユーザーのmysqlテーブルに新しいメッセージが挿入されるたびにクライアントが通知されるようにするにはどうすればよいですか?

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

データベースでポーリングを行いたくない場合は、listen/notify をサポートする postgresql データベースを使用できます。テーブルに変更があるとすぐに通知されます。

于 2014-01-16T16:17:04.797 に答える