首页 文章

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

提问于
浏览
0

我想使用具有刷新率的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 回答

  • 0

    您不应在服务器端javascript的第19行中指定变量 id . 如果这样做,您的HTTP处理程序的工作是通过查询字符串更新此全局可见变量 . 因此,带有查询字符串 ?id=x 的最后一个HTTP GET请求会将变量id更新为x .

    相反,你应该使用像 ids 这样的 Map ,并在任何人用 ?id=x 等查询字符串命中GET请求时将值推入其中,然后在你的函数 pollingLoop 中使用这个 Map 对象 .

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

相关问题