我刚刚将一个MySQL数据库连接到我的node.js服务器上,用于我正在进行的游戏。为了测试客户端,服务器和数据库之间是否存在通信,我设置了一些函数来模拟登录游戏的人。沟通有效,但也观察到一些奇怪的行为。每次单击登录按钮时,都会从客户端向服务器发出loginAttempt消息。然后检查凭证以查看它们是否有效。然后将loginSuccess消息发送回客户端,其中包含表示成功或失败的true或false数据。奇怪的行为从这里开始,客户端似乎每次顺序调用都会收到一条额外的消息。下面显示代码,其中包含3次失败尝试和1次成功尝试的相应日志输出。
客户代码:
function logIn(user, pass) {
socket.emit("loginAttempt", user, pass);
console.log("1");
socket.on("loginSuccess", function (data) {
console.log("2");
if (data === true) {
console.log("3");
socket.emit("loginSuccess");
$("body").empty();
$("body").load("game.html");
}
else {
console.log("4");
socket.emit("loginFail");
}
});
}
其中socket
是连接到服务器的socket.io变量
服务器代码:
io.on("connection", function (socket) {
console.log("User has connected");
connection.connect(function (err) {
if (err) {
console.error("Error connecting to database: " + err.stack);
return;
}
console.log("Connected to database");
});
socket.on("disconnect", function (socket) {
connection.end();
console.log("User has disconnected.");
});
socket.on("loginAttempt", function (username, password) {
console.log("1");
connection.query("SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'", function (err, rows, fields) {
console.log("2");
if (err) {
throw err;
}
else {
if (rows.length === 0) {
socket.emit("loginSuccess", false);
console.log("3");
}
else {
socket.emit("loginSuccess", true);
console.log("4");
}
}
});
});
socket.on("loginSuccess", function () {
console.log("Login Successful!")
});
socket.on("loginFail", function () {
console.log("Login Fail!");
});
});
其中connection
是用于连接到数据的变量
客户输出:
1 //Attempt 1
2
4
1 //Attempt 2
2
4
2
4
1 //Attempt 3
2
4
2
4
2
4
1 //Attempt 4
2
3
2
3
2
3
2
3
可以看出,这些数字代表了正在执行的代码的不同部分。
服务器输出:
User has connected
Connected to database
1
2
3
Login Fail!
1
2
3
Login Fail!
Login Fail!
1
2
3
Login Fail!
Login Fail!
Login Fail!
1
2
4
Login Successful!
Login Successful!
Login Successful!
Login Successful!
我认为这是一个重新连接到服务器的每次点击和客户端然后充当多个客户端的问题,但如果是这种情况我会期望有多个"用户已连接"日志。它似乎是客户端收到增量loginSuccessful, data
消息,但我不明白为什么会发生这种情况,因为发出此消息的服务器代码只运行一次。现在,我不知道为什么会发生这种情况或者可能导致这种情况发生的原因。