1

我想使用 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>
4

1 回答 1

0

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

相反,您应该使用类似ids的映射,并在任何人使用类似查询字符串的 GET 请求时将值推送到其中?id=x,然后在您的函数中使用此映射对象pollingLoop

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

于 2013-07-06T11:00:41.747 回答