gpt4 book ai didi

mysql - NodeJS + MySQL + Socket.IO : Update database

转载 作者:可可西里 更新时间:2023-11-01 07:35:28 25 4
gpt4 key购买 nike

我目前正在寻找有关使用 NodeJS 和 MySQL 数据库推送通知的解决方案。

我想结合 NodeJS 和 Socket.IO 来提供推送通知,但问题是我不知道如何让我的服务器检查我的数据库是否有更新。

我已经有了一个完美运行的“轮询”方法,但它有点乱,而且这在服务器调用和响应方面并没有真正优化。

所以这个想法是,当用户 A 在我的数据库中插入一些东西时,所有关注他的客户都会通过推送(推送,而不是轮询。)得到通知。

这是我目前为我的 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 );
});
};

如果您有任何建议、解决方案或有用的东西,请不要犹豫。

提前致谢

最佳答案

这里我可以想到两种解决方案。

1) 从上传新信息的同一请求发起推送。我的意思是,您现在的流程可能是:

  1. 获取客户请求
  2. 将内容插入数据库
  3. 返回给客户

使用 Node,您可以在发送响应后做更多的事情。例如 1. 获取客户端请求 2.将东西插入数据库 3. 返回客户端 4. 查找所有正在订阅且当前已登录的订阅者 5.发送推送

2) 这种方法更加分布式。您可以在最后的步骤中使用 pub/sub 方法。让一个不同的进程处理所有推送,并让您的主进程(处理更新请求的部分)将新内容发布到队列中。这会在每次有新内容时提醒您的推送过程,这比轮询您的数据库要好得多。

请注意,对于这两种解决方案中的任何一种,您都必须找到一种好方法来跟踪哪些套接字连接到哪些客户端,以便您可以快速地从其套接字外部向特定客户端发送消息。一个快速的方法可能是将每个用户添加到他们自己的房间,以他们的用户名或 user_id 命名,这样您就可以轻松地将更新推送给以订阅用户命名的房间的所有参与者。如果房间里没有人,则不会发送任何请求。

关于mysql - NodeJS + MySQL + Socket.IO : Update database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15454844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com