2013-05-10 3 views
10

У меня есть node.js-сервер, который подключается к базе данных mysql и открывает новый сокет, используя socket.io. Роль этого сервера в основном заключается в том, чтобы уведомить любого клиента (пользователя), который подключается к нему, когда в таблице базы данных есть новое сообщение для этого пользователя. Приведенный ниже код работает только в том случае, если клиент явно выдает запрос «check_messages». Как я могу изменить его так, чтобы клиент был уведомлен, когда новое сообщение было вставлено в таблицу mysql для этого пользователя, вместо того, чтобы клиент явно выдавал запрос «check_messages»?Socket.io для проверки обновлений из базы данных

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

Привет, Ваша проблема решена? И как? Благодарю. – diligent

ответ

1

Вы можете запустить свой код в обработчике событий таймера на сервере.

ниже код проверки базы данных для нового сообщения на каждые 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

Я думал об этом, но есть ли способ уведомить клиента точно, когда строка вставлена ​​в таблицу вместо сервера, проверяющего базу данных? Смысл, есть ли какой-то механизм, когда при вставке строки в таблицу отправляется уведомление на сервер, а сервер, в свою очередь, отправляет уведомление клиенту? –

+0

@ user791345 Я думаю, вы должны реализовать очередь сообщений, используя redis с быстрым клиентом node_redis. Он имеет встроенную семантику pubsub. – zavg

+0

Можете ли вы предоставить более подробную информацию? Извините, я новичок в узле и его модулях. –

3

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

Implementation example

+0

Это действительно потрясающе! Есть ли недостатки в использовании Postgresql по сравнению с MySQL? –

Смежные вопросы