【问题标题】:Socket.io emits duplicate data after browser refreshSocket.io 在浏览器刷新后发出重复数据
【发布时间】:2014-02-07 18:06:58
【问题描述】:

我有一个带有按钮的页面。单击按钮时,它通过 socket.io 获取数据。但是,每次我重新加载页面时,socket.io 都会从前一个数据集中发回一份额外的数据副本。所以我的数据在第一次加载页面时看起来不错(例如:abcd)。然后重新加载页面会得到2n个数据(abcdabcd),再次重新加载页面我得到3n个数据(abcdabcdabcd)等等。

如何避免在页面重新加载时将重复数据发送回客户端?这是我的代码。

服务器端:

app.get('/test', function(req, res){

        // some code...

    io.sockets.on("connection", function(socket){

        var socketFn = function(data){
            socket.emit("trends", {
                trends: JSON.parse(redisData)
            });
        };

        socket.on("action", socketFn);

        socket.on("disconnect", function(){
            socket.removeListener("action", socketFn); // this doesn't work
        });

    });
    res.render('test');

});

客户端:

    var socketOpts = {
    "sync disconnect on unload" : true
};
var socket = io.connect("", socketOpts);

socket.on("trends", function(data){
    // data received from the node server, so do something with it
});


function action(){
    socket.emit("action", {phrase: "some dummy data"});
    return false;
}

// already checked client side doesn't fire multiple click event
$("button#click").off("click").on("click", action); 

【问题讨论】:

    标签: ios node.js sockets


    【解决方案1】:

    那是因为你听连接的次数与客户端点击页面的次数一样多。

    app.get('/test', function(req, res){
    //when client opens the page 
    
        io.sockets.on("connection", function(socket){
        //start listening to new connection
        ...
    

    从你的路由中初始化连接事件监听器被认为是一个坏主意。它应该只在全球范围内执行一次。在这里,每次您的客户端访问该页面时,它都会在访问该页面的次数中监听事件。

    【讨论】:

    • 如果我想在我的路由中初始化连接事件监听器怎么办?如果我有 10 页,并且只有 1 页我想实现 socket.io。
    • @miksii 还是个坏主意。您创建多个连接处理程序 - 页面被点击的次数。页面点击会杀死你的 socket.io 服务器。如果您有单独的问题,请创建一个新问题。我的回答解决了 OP 的特殊问题。
    • 我想知道是否应该创建一个新主题。在我的例子中,我有 /dashboard 路由来呈现dashboard.jade 页面。在该页面中,我有使用 socket.io 和 mongodb 的简单聊天应用程序。我注意到,如果我为 /dashboard 路由中的套接字设置编程逻辑,则每次刷新页面时都会复制数据。例如;如果我发送“abc”,它将发送“abc”,而不是如果我刷新我的页面并发送“abc”,它将发送“abc”,“abc”。有什么建议吗?附言。如果您愿意,我可以创建一个新问题并提出您的建议作为答案。谢谢。
    • @miksiii 通过删除路线内的部分对其进行测试。这是一个常见的陷阱,很可能不是人们想要的,但不知道如何添加它。除非您明确将其删除,否则您在连接中添加的内容将永远存在。您可能希望在已经建立初始连接后使其连接到服务器。
    • 我在这里提出了一个新问题:stackoverflow.com/questions/28350928/… 谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-01-16
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2011-05-18
    相关资源
    最近更新 更多