Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 每次用户添加新数据时,节点都会多次发回数据_Javascript_Node.js_Socket.io - Fatal编程技术网

Javascript 每次用户添加新数据时,节点都会多次发回数据

Javascript 每次用户添加新数据时,节点都会多次发回数据,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,首先,我要为这个措辞糟糕的标题道歉;在过去的20分钟里,我一直在想一个问题,但我不知道用什么简洁的方式来描述我遇到的问题。如果有人有更好的建议,请让我知道或编辑标题,如果你能 背景:为了学习NodeJS,我正在创建一个聊天服务器。当用户单击createRoomBtn时,将创建一个包含用户刚刚创建的房间名称的事件,并发送到app.js中的socket.js模块,app.js然后将房间附加到房间数组中(这些房间在浏览器中显示为列表),以及向包括活动用户在内的所有用户创建广播事件 问题:假设有一个空列

首先,我要为这个措辞糟糕的标题道歉;在过去的20分钟里,我一直在想一个问题,但我不知道用什么简洁的方式来描述我遇到的问题。如果有人有更好的建议,请让我知道或编辑标题,如果你能

背景:为了学习NodeJS,我正在创建一个聊天服务器。当用户单击
createRoomBtn
时,将创建一个包含用户刚刚创建的房间名称的事件,并发送到
app.js
中的
socket.js
模块,app.js然后将房间附加到房间数组中(这些房间在浏览器中显示为列表),以及向包括活动用户在内的所有用户创建广播事件

问题:假设有一个空列表,用户添加了一个名为“NodeJS”的新房间,这将在屏幕上显示房间,一切都很好。现在,如果要添加另一个文件室,例如Socket.io,浏览器将呈现以下结果:
Socket.io、NodeJS、NodeJS
。如果我添加“Javascript”,结果将是
Javascript、Socket.io、NodeJS、Socket.io、Node.JS
。基本上,浏览器一次又一次地呈现列表,每次列表缩小一倍。我一点也不知道为什么会发生这种情况。奇怪的是,如果我按“刷新”,浏览器会正确地呈现列表
Javascript、Socket.io、NodeJS
。发生了什么事

socket.js

module.exports = function(io, rooms) {
    var chatrooms = io.of('/roomlist').on('connection', function(socket) {  //io.of creates a namespace 
        console.log('Connection established on the server');
        socket.emit('roomupdate', JSON.stringify(rooms));   


        socket.on('newroom', function(data) {
            console.log(data);
            rooms.push(data);
            socket.broadcast.emit('roomupdate', JSON.stringify(rooms)); 
            socket.emit('roomupdate', JSON.stringify(rooms));   

        })      
    })

    var messages = io.of('/messages').on('connection', function(socket) {   
        console.log('Connected to the chatroom!');

        socket.on('joinroom', function(data) {
            socket.username = data.user; 
            socket.userpic = data.userPic;
            socket.join(data.room);         
        })

        socket.on('newMessage', function(data) {

            socket.broadcast.to(data.room_number).emit('messagefeed', JSON.stringify(data));  
        })
    })
} 
聊天室。html:

<!doctype html>
    <html lang="en">
    <head>
        <meta charset="utf-8">
        <title>{{title}}</title>
        <link rel="stylesheet" href="../css/chatrooms.css">
        <script src="//code.jquery.com/jquery-1.11.0.min.js"> </script> 
        <script src="/socket.io/socket.io.js"> </script> 
        <script>
        $(function() {
            var host = '{{config.host}}';       
            var socket = io.connect(host + '/roomlist');

            socket.on('connect', function() {
                console.log('connection established');      
            })  
            socket.on('roomupdate', function(data) {
                $('.roomlist').html('');

                var procData = JSON.parse(data); 

                for (var i = 0; i < procData.length; i++) { 
                    var str = '<a href="room/' + procData[i].room_number + '"><li>'
                    + procData[i].room_name + '<li></a>'; 
                    $('.roomlist').prepend(str);

                    console.log(str);

                }
            }) 

            $(document).on('click', '#createRoomBtn', function() {
                var room_name = $('#newRoomText').val();
                console.log(room_name);
                if (room_name != '') {
                    var room_number = parseInt(Math.random() * 10000);
                    socket.emit('newroom', {room_name: room_name, room_number: room_number});
                    $('#newRoomText').val('');                  
                }
            }) 
        }) 

        </script>
    </head>  

<body>

    <div class="cr-userbox">
        <img src="{{user.profilePic}}" class="userPic">
        <h3 class="username">{{user.fullName}}| <a href="/logout">Logout</a></h3>
    </div>


    <div class="cr-container">
        <h1> ChatRooms</h1>
        <div class="cr-newroom">
            <input type="text" id="newRoomText" autocomplete="off">
            <input type="submit" id="createRoomBtn" value=" Create Room">
        </div>

        <div class="cr-roomlist">
            <ul class="roomlist">
            </ul>
        </div>
    </div>
</body>
</html>

{{title}}
$(函数(){
var host='{{config.host}}';
var socket=io.connect(主机+'/roomlist');
socket.on('connect',function(){
console.log(“已建立连接”);
})  
socket.on('roomupdate',函数(数据){
$('.roomlist').html('');
var procData=JSON.parse(数据);
对于(var i=0;i

如果需要更多信息/模块,请告知我,我很乐意提供


更新1:正如alex rokabilis正确建议的那样,我已将
$('.roomlist').html()='
更改为
$('.roomlist').html(''')
,但问题仍然存在

我认为问题在于如何在html部分呈现房间,而不是socket.io如何发送数据。 您使用
$('.roomlist').html=''但这没有任何作用
.html
是jquery中的一个函数,因此正确的做法是
$('.roomlist').html(''')

因此,基本上你没有删除以前的房间,而是只添加了更多的副本。我还注意到,在您的nodejs代码中,您使用了:
socket.broadcast.emit('roomupdate',JSON.stringify(rooms));
emit('roomupdate',JSON.stringify(rooms))

如果您想向所有连接的客户端广播某些内容,那么它有一个功能,而且不需要对数据进行字符串化,socketio可以在内部为您执行此操作!所以你可以用这样的东西:
io.emit('roomupdate',房间)

我不确定这是否是问题的原因,但您得到的是嵌套列表删除,因为您的套接字中有两个打开的
  • 标记。on('roomupdate')函数

    感谢您指出jquery错误,但它并不能解决问题。另外,我使用的是旧版本的socket,所以您的代码不起作用,但我肯定会在我的下一个项目中使用您的建议!