NodeJS+;MySQL+;Socket.IO:更新数据库
我目前正在寻找一个关于使用NodeJS和MySQL数据库推送通知的解决方案 我想将NodeJS与Socket.IO结合起来提供推送通知,但问题是我不知道如何让服务器检查是否有来自数据库的更新 我已经有了一个“轮询”方法,它工作得很好,但是它有点混乱,并且在服务器调用和响应方面没有真正优化 所以我们的想法是,当用户A在我的数据库中插入某个内容时,所有跟随他的客户机都会收到push(push,而不是poll)通知 这是我目前为我的server.js准备的:NodeJS+;MySQL+;Socket.IO:更新数据库,mysql,node.js,websocket,push-notification,Mysql,Node.js,Websocket,Push Notification,我目前正在寻找一个关于使用NodeJS和MySQL数据库推送通知的解决方案 我想将NodeJS与Socket.IO结合起来提供推送通知,但问题是我不知道如何让服务器检查是否有来自数据库的更新 我已经有了一个“轮询”方法,它工作得很好,但是它有点混乱,并且在服务器调用和响应方面没有真正优化 所以我们的想法是,当用户A在我的数据库中插入某个内容时,所有跟随他的客户机都会收到push(push,而不是poll)通知 这是我目前为我的server.js准备的: var app
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 );
});
};
如果你有任何建议、解决方案或是有用的东西,不要犹豫
提前感谢我可以在这里想出两种解决方案 1) 从上载新信息的同一请求启动推送。我的意思是,你现在的流量可能是:
请注意,对于这两种解决方案中的任何一种,您都必须找到一种跟踪哪些套接字连接到哪些客户端的好方法,以便您能够从套接字外部向特定的客户端发送消息。一种快速的方法是将每个用户添加到他们自己的房间中,以他们的用户名或用户id命名,这样您就可以轻松地将更新推送到以订阅用户命名的房间的所有参与者。如果房间内无人,则不会发送任何请求。感谢您提供此解决方案。我要检查两个,看看哪一个更有效!我的想法是,我的轮询版本工作得很好(不是很难),但使用NodeJS进行轮询有点“庞大”(我可以在没有NodeJS的情况下进行轮询)。如果我有一个解决方案,我会把它贴在这里给大家看。再次感谢第二种解决方案类似于轮询数据库,但是您的应用程序基本上会说“嘿,现在有新的东西给您了!”,而不是您不断地问“嘿,您有什么要给我的吗?”您可以尝试使用setInterval在一段时间后调用数据库中的更新吗