Длинный опрос с использованием node.js для получения обновлений базы данных
Я довольно новичок в Node JS, так как я перешел со страниц Java-сервера на узел в основном для реализации технологии push-сервера.
Я хочу реализовать простое приложение, которое будет передавать данные пользователям, если в базу данных Mysql будет добавлена какая-либо новая запись.
И взять имя базы данных как wst, а имя таблицы - зарегистрированный_пользователь. Таблица состоит из одного столбца с именем users.
Знайте, если какая-либо запись вставлена в таблицу, она должна уведомить, что новый пользователь добавлен к текущим пользователям.
Как я могу этого достичь.
Спасибо за любую помощь.
2 ответа
Для этого и были созданы библиотеки типа http://socket.io/. Это делает операции проталкивания сервера тривиальными.
Что касается того, как на самом деле инициировать принудительную передачу сервера, это может быть более сложным в зависимости от того, как вы вводите данные в базу данных. Если все данные в и из базы данных mysql проходят через одно и то же приложение узла, это довольно просто. Просто создайте событие, когда есть вставка в таблицу, и ваш socket.io (или другой push-код) прослушивает эти события. Затем каждый раз, когда пользователь добавляет, сообщение отправляется.
Если база данных обновляется из нескольких приложений, все становится немного сложнее. Вы можете опросить базу данных на предмет обновлений пользовательской таблицы, а затем выбрать последних пользователей, когда она изменится. Вы можете сделать что-то вроде следующего:
setInterval(function() {
getUserCount(function(userCount) {
if(userCount > originalUserCount) {
// We have new users!
// Get the latest user and send it to the connected browsers.
}
});
}, 1000);
Это не очень эффективно, но делать SELECT COUNT(id) FROM Users;
не должен добавлять много накладных расходов на вашу базу данных. Более чистое решение - использовать какую-то очередь сообщений. Если у вас есть несколько систем, взаимодействующих в одной базе данных, система обмена сообщениями может гарантировать, что вы дадите всем этим системам возможность подписаться на события, происходящие в других частях системы. В этом случае вы можете сделать так, чтобы приложение вашего узла подписывалось на новые пользовательские сообщения в системе и отправляло их в браузеры.
http://socket.io/ это то, что вы ищете.
Как показано в документации, его очень просто слушать на сервере с помощью socket.io
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
И подключиться к нему, используя,
var socket = io.connect('http://localhost');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
Вы можете добиться push, передавая обновление всем подключенным клиентам, используя io.sockets.emit(object);
всякий раз, когда состояние вашей базы данных изменяется.
Также возможно ограничить сообщение определенным набором клиентов, используя комнаты