如何以刷新率在nodejs中显示来自mysql的数据
Posted
技术标签:
【中文标题】如何以刷新率在nodejs中显示来自mysql的数据【英文标题】:How to show data from mysql in nodejs with a refresh rate 【发布时间】:2013-07-04 06:50:55 【问题描述】:我想使用 nodejs 以刷新率显示来自 mysql 的数据。我已经完成了以下编码并获得了结果。但问题是,如果我在浏览器的一个选项卡中打开 localhost:8000/?id=1,它会显示来自 MySQL 的 id 1 数据,但如果我在另一个选项卡上打开 localhost:8000/?id=2,它会显示数据id 2 但同时,第一个选项卡也开始显示 id 2 的数据。我需要在不同选项卡的 URL 中显示来自 MySQL 的特定 id 的数据。
在我写的 server.js 中
var app = require('http').createServer(handler), 网址 = 要求(“网址”), io = require('socket.io').listen(app), fs = 要求('fs'), mysql = 要求('mysql'), 连接数组 = [], 连接 = mysql.createConnection( 主机:'本地主机', 用户:'根', 密码: '', 数据库:'nodetest' ), POLLING_INTERVAL = 3000, 轮询定时器; 连接.连接(功能(错误) 控制台日志(错误); ); app.listen(8000); 变量编号; 函数处理程序(req,res) var url_parts = url.parse(req.url, true); 变种查询 = url_parts.query; 如果(查询.id) id = 查询.id; 控制台.log(id); fs.readFile('client.html', 功能(错误,数据) 如果(错误) 控制台日志(错误); res.writeHead(500); return res.end('加载client.html时出错'); res.writeHead(200); res.end(数据); ); var pollingLoop = 函数() var query = connection.query('SELECT * FROM users WHERE id = ' + id), 用户 = []; query.on('错误', 功能(错误) 控制台日志(错误); 更新套接字(错误); ).on('结果', 功能(用户) users.push(user); )。结束', 功能() 如果(connectionsArray.length) pollingTimer = setTimeout(pollingLoop, POLLING_INTERVAL); 更新套接字( 用户:用户 ); ); ; io.sockets.on('连接', 功能(套接字) console.log('连接数:' + connectionsArray.length); 如果(!connectionsArray.length) 轮询循环(); socket.on('断开连接', 功能() var socketIndex = connectionsArray.indexOf(socket); console.log('socket = ' + socketIndex + '断开连接'); if (socketIndex >= 0) connectionsArray.splice(socketIndex, 1); ); console.log('新的套接字已连接!'); connectionsArray.push(socket); ); var updateSockets = 函数(数据) data.time = 新日期(); 连接数组.forEach(函数(tmpSocket) tmpSocket.volatile.emit('通知',数据); ); ;在client.html中我写了
<html>
<head>
<script src="socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">
var socket = io.connect('http://localhost:8000');
socket.on('notification',
function(data)
var usersList = "<div>";
$.each(data.users,
function(index, user)
usersList += "<div><p><span style='width:100px;float:left;text-align:center'>Name :</span>" + user.name + "</p></div>" + "<div><p><span style='width:100px;float:left;text-align:center'>First Name :</span>" + user.flane + "</p></div>" + "<div><p><span style='width:100px;float:left;text-align:center'>Last Name :</span>" + user.lname + "</p></div>";
);
usersList += "</div>";
$('#container').html(usersList);
);
</script>
</head>
<body>
<div id="container">Loading ...</div>
</body>
</html>
【问题讨论】:
这里的问题是您每次都使用相同的变量设置 id,所以也许不是在全局级别使用 id,而是将其写入socket.selecetedID
并从那里查询:)
【参考方案1】:
您不应在服务器端 javascript 的第 19 行中指定变量 id。如果这样做,您的 HTTP 处理程序的工作就是通过查询字符串更新这个全局可见变量。因此,最后一个带有查询字符串?id=x
的 HTTP GET 请求会将变量 id 更新为 x。
相反,您应该使用 ids 之类的映射,并在有人使用 ?id=x
之类的查询字符串点击 GET 请求时将值推送到其中,然后在您的函数 pollingLoop
中使用此映射对象。
但是,在当前解决方案非常喜欢广播的情况下,它仍然不符合您的要求,因为它无法为每个会话提供数据。你可以看看session.socket.io。
【讨论】:
假设两个查询 ?id=1 和 ?id=2 我有 ids = [1,2]。现在如何在 pollingLoop 中使用这张地图以上是关于如何以刷新率在nodejs中显示来自mysql的数据的主要内容,如果未能解决你的问题,请参考以下文章
如何以 Node JS 作为后端将 Mysql 数据获取并显示到 ReactJS 前端?
刷新页面显示找不到文件错误如何使用 [angular js + NodeJS/ExpressJS] 解决
如何在 javascript (ionic | Angular | NodeJS | MongoDB) 中将包含对象的数组展平和减少为逗号分隔的字符串