我想使用具有刷新率的nodejs来显示来自MySQL的数据。我做了以下编码并得到结果。但问题是,如果我在浏览器的一个选项卡上打开localhost:8000/?id=1,它会显示来自MySQL的id 1的数据,但如果我在另一个选项卡上打开localhost:8000/?id=2,它会显示id 2的数据,但同时,第一个选项卡也开始显示id 2的数据。我需要在不同的标签上显示来自MySQL的URL中特定id的数据。
在server.js中我写了
var app = require('http').createServer(handler), url = require("url"), io = require('socket.io').listen(app), fs = require('fs'), mysql = require('mysql'), connectionsArray = [], connection = mysql.createConnection({ host: 'localhost', user: 'root', password: '', database: 'nodetest' }), POLLING_INTERVAL = 3000, pollingTimer; connection.connect(function(err) { console.log(err); }); app.listen(8000); var id; function handler(req, res) { var url_parts = url.parse(req.url, true); var query = url_parts.query; if (query.id) { id = query.id; console.log(id); } fs.readFile('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 * FROM users WHERE id = ' + id), users = []; query.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); }); };
在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>
您不应该在服务器端JavaScript的第19行中指定变量id。如果这样做,HTTP处理程序的工作就是通过查询字符串更新这个全局可见变量。因此,查询字符串?id=x
的最后一个HTTP GET请求将把变量id更新为x。
相反,您应该使用像ids这样的映射,当任何人用查询字符串?id=x
点击GET请求时将值推入其中,然后在函数pollingloop
中使用这个映射对象。
但是,它仍然不符合您的要求,因为当前的解决方案非常喜欢广播,因为它不能提供每个会话的数据。您可以查看session.socket.io。