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