Я в настоящее время ищу решение о push-уведомлениях с помощью NodeJS и базы данных MySQL.NodeJS + MySQL + Socket.IO: обновить базу данных
Я хочу объединить NodeJS с Socket.IO для предоставления push-уведомлений, но проблема в том, что я не знаю, как попросить мой сервер проверить, есть ли обновление из моей базы данных.
У меня уже есть метод «опроса», который отлично работает, но он немного грязный, и это не очень оптимизируется с точки зрения вызовов и ответов сервера.
Итак, идея заключается в том, что когда пользователь А вставляет что-то в мою базу данных, все клиенты, которые следуют за ним, получают уведомление посредством push (push, not poll.).
Это то, что у меня есть на данный момент для моего server.js:
var app = require('http').createServer(handler),
io = require('socket.io').listen(app),
fs = require('fs'),
mysql = require('mysql'),
connectionsArray = [],
connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : 'root',
database : 'nodejs'
}),
POLLING_INTERVAL = 5000,
pollingTimer;
connection.connect(function(err) {
console.log(err);
});
app.listen(1337);
function handler (req, res) {
fs.readFile(__dirname + '/client.html' , function (err, data) {
if (err) {
console.log(err);
res.writeHead(500);
return res.end('Error loading client.html');
}
res.writeHead(200);
res.end(data);
});
}
var pollingLoop = function() {
var query = connection.query('SELECT notif FROM notifications WHERE id_user=1 AND status=0'),
users = [];
.on('error', function(err) {
console.log(err);
updateSockets(err);
})
.on('result', function(user) {
users.push(user);
})
.on('end',function(){
if(connectionsArray.length) {
pollingTimer = setTimeout(pollingLoop, POLLING_INTERVAL);
updateSockets({users:users});
}
});
};
io.sockets.on('connection', function (socket) {
console.log('Number of connections:' + connectionsArray.length);
if (!connectionsArray.length) {
pollingLoop();
}
socket.on('disconnect', function() {
var socketIndex = connectionsArray.indexOf(socket);
console.log('socket = ' + socketIndex + ' disconnected');
if (socketIndex >= 0) {
connectionsArray.splice(socketIndex, 1);
}
});
console.log('A new socket is connected!');
connectionsArray.push(socket);
});
var updateSockets = function (data) {
data.time = new Date();
connectionsArray.forEach(function(tmpSocket){
tmpSocket.volatile.emit('notification' , data);
});
};
Если у вас есть какие-либо советы, решение или что-то, что может быть полезным, не стесняйтесь.
Заранее благодарен
Спасибо за это решение. Я собираюсь проверить их обоих, чтобы увидеть, что один будет более эффективным! Думаю, что моя версия опроса работает отлично (не очень сложно), но использование NodeJS для опроса немного «огромно» (я могу делать опрос без NodeJS). Если я приду с решением, я собираюсь опубликовать его здесь для всех. Еще раз спасибо – Simon
Второе решение похоже на опрос базы данных, однако ваше приложение в основном говорит: «Эй, сейчас для вас что-то новое!», вместо того чтобы вы постоянно спрашивали: «Эй, у вас есть что-нибудь для меня еще?» –