Jay*_*988 1 javascript function node.js socket.io node-mysql
目前在服务器上使用 NodeJS、Express、Socket.io 和 node-mysql。目前,服务器上的其中一项功能出现问题,根本不返回任何数据。我在我的尽头机智试图弄清楚这一点。
功能代码;
它应该返回“c”,但不起作用。console.log 实际上显示了 ID 和用户名。
function LOGIN_USER(a,b) {
// a = username
// b = password
var c = [];
connection.query("SELECT ID FROM GAME_PLAYER WHERE USR = '" + a + "' AND PWD = '" + b + "'", function(err,rows,field) {
if (err) throw err;
for (var i in rows) {
c.ID = rows[i].ID;
c.USR = a;
}
console.log(c.ID + " " + c.USR);
return c;
});
}
Run Code Online (Sandbox Code Playgroud)
其他代码。
socket.on('login user', function(data) {
var c;
c = LOGIN_USER(data.username,data.password);
console.log(c.ID,c.USR);
});
Run Code Online (Sandbox Code Playgroud)
在这个 console.log 之后,我的 nodeJS 服务器崩溃了。说它不能显示未定义等。等等。我一生都无法弄清楚这一点,非常感谢任何帮助!:)
MySQL 查询是异步的,因此您不能在其中使用返回值。在异步编程中,必须使用回调,因为返回语句会停止执行:
function LOGIN_USER(a, b, callback) {
// a = username
// b = password
var c = [];
connection.query("SELECT ID FROM GAME_PLAYER WHERE USR = '" + a + "' AND PWD = '" + b + "'", function (err, rows, field) {
if (err) throw err;
for (var i in rows) {
c.ID = rows[i].ID;
c.USR = a;
}
console.log(c.ID + " " + c.USR);
callback(c);
});
}
Run Code Online (Sandbox Code Playgroud)
然后这就是你使用它的方式:
socket.on('login user', function(data) {
LOGIN_USER(data.username, data.password, function(c) {
console.log(c.ID, c.USR);
});
});
Run Code Online (Sandbox Code Playgroud)
当您在回调函数中使用 return 语句时,它的作用就像您使用了 一样return;,这反过来只会停止函数的执行。这是回调的工作方式:
您将值传递给一个函数以及另一个函数:
var func = function() {
// do something
};
LOGIN_USER(a, b, func);
Run Code Online (Sandbox Code Playgroud)
当用户登录完成后,登录函数将调用传递给它的函数:
function LOGIN_USER(a, b, callback) {
// do some work
callback();
};
Run Code Online (Sandbox Code Playgroud)
所以你传递func()给LOGIN_USER(), 并在它完成时LOGIN_USER()调用func()。
| 归档时间: |
|
| 查看次数: |
2096 次 |
| 最近记录: |