gpt4 book ai didi

javascript - NodeJS socket.io 应用程序在按下按钮时卡住

转载 作者:行者123 更新时间:2023-12-01 01:15:00 24 4
gpt4 key购买 nike

我正在尝试创建一个简单的 NodeJS 排行榜,并使用 socket.io 进行客户端和服务器之间的实时连接。一切都很顺利,但是按下“增加”按钮后,页面崩溃,我必须关闭它。在页面崩溃之前,我在浏览器控制台中看不到任何错误,并且命令提示符(我运行应用程序的位置)中也没有错误。

我试图使用socket.on('increase')实现的目标是确定作为参数给出的名称是否已在表中。如果是,则替换表中另一列中的分数值,但如果不是,则向表中添加一个新行,其中包含用户名和分数。

但我不知道为什么页面崩溃了。但是,我非常确定这与 usernameForm 有关,因为当我删除它时,问题就不再出现。

index.html

<!doctype html>
<html>
<body>
<form id="usernameForm">
<input type="text" id="usernameFormInput" name="usernameFormInput">
<input type="submit" value="Submit">
</form>
<div id="users"></div>
<button id="increase">Increase</button><br>
<span id="score">0</span><br>
<table id="leaderboard">
<tr>
<th>Name</th>
<th>Score</th>
</tr>
</table>

<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io();

var playerName = "Jeff";
var playerScore = 0;

document.getElementById("increase").onclick = function() {
playerScore += 1;
document.getElementById("score").innerHTML = playerScore;
socket.emit('increase', playerName, playerScore);
};

document.getElementById("usernameForm").onsubmit = function(e) {
var newUsername = document.getElementById("usernameFormInput").value;
socket.emit('newUser', newUsername);
console.log("new user client");
e.preventDefault();
}

socket.on('increase', function(user, score) {
for (i = 0; i < document.getElementById("leaderboard").rows.length; i++) {
if (document.getElementById("leaderboard").rows[i].cells[0].innerHTML == user) {
document.getElementById("leaderboard").rows[i].cells[1].innerHTML = score;
}
else {
var table = document.getElementById("leaderboard");
var row = table.insertRow(0);
var userCell = row.insertCell(0);
var scoreCell = row.insertCell(0);
userCell.innerHTML = user;
scoreCell.innerHTML = score;
}
}
});

socket.on('newUser', function(name) {
playerName = name;
console.log("new user client cb");
});

socket.on('updateUsers', function(usernames) {
document.getElementById('users').innerHTML = Object.values(usernames);
});
</script>
</body>
</html>

app.js

var io = require('socket.io')(http);

var usernames = [];
var userScore = {};

var isUsernameTaken = function(data) {
for (var i = 0; i <= Object.keys(usernames).length; i++) {
console.log("loop entered");
if(data == usernames[i]) {
console.log("Username '" + data + "' is taken.")
return true;
} else {
console.log("Username '" + data + "' is not taken.");
usernames.push(data);
updateUsers();
return false;
}
}
}

var updateUsers = function() {
io.emit('updateUsers', usernames);
console.log(usernames);
};

io.on('connection', function(socket) {
socket.on('increase', function(user, score) {
userScore[user] = score;
io.emit('increase', user, score);
});

socket.on('newUser', function(name) {
console.log("new user server");
if ( isUsernameTaken(name) ) {
console.log("username taken");
}
else {
console.log("new user server loop");
usernames.push(name);
io.emit('newUser', name);
}
});
});

http.listen(4000, function(){
console.log('listening on *:4000');
});

我对冗长的代码表示歉意,但是当我尝试维护 MCVE 时,我还需要包含所有相关的代码以找到问题的根源。

最佳答案

事件发射器是同步的。看起来 .emit('increase' 同步触发 socket.on('increase') ,因此创建了一个导致网页崩溃的无限循环。尝试执行 socket .once(如果受支持),或者在第一次触发后删除 socket.on('increase' 事件监听器,如果这修复了页面,那么您就知道这就是原因.

关于javascript - NodeJS socket.io 应用程序在按下按钮时卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54846214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com