我想使用具有刷新率的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>
1 回答
您不应在服务器端javascript的第19行中指定变量 id . 如果这样做,您的HTTP处理程序的工作是通过查询字符串更新此全局可见变量 . 因此,带有查询字符串
?id=x
的最后一个HTTP GET请求会将变量id更新为x .相反,你应该使用像 ids 这样的 Map ,并在任何人用
?id=x
等查询字符串命中GET请求时将值推入其中,然后在你的函数pollingLoop
中使用这个 Map 对象 .但是,当前的解决方案非常喜欢广播时,它仍然不符合您的要求,因为它无法为每个会话提供数据 . 你可以看一下session.socket.io .