提问者:小点点

如何用刷新率在nodejs中显示mysql中的数据


我想使用具有刷新率的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这样的映射,当任何人用查询字符串?id=x点击GET请求时将值推入其中,然后在函数pollingloop中使用这个映射对象。

但是,它仍然不符合您的要求,因为当前的解决方案非常喜欢广播,因为它不能提供每个会话的数据。您可以查看session.socket.io。