我被困在这件事上有一段时间了,我不知道怎么了。我有一个名为database.js的独立类,它运行MySQL函数,管理连接、查询等。我一直试图让它从它应该返回的第一行(用户名和密码正确的用户)中获取信息,但是它说变量是未定义的。如果在返回函数之前在函数中记录objects字段,它们都可以正常工作。
下面是一些上下文代码:

socket.on('loginAttempt', function(data) {
    //Check credentials with database...
    try {
        var fuser = Database.checkAccount(data.username, data.password);
        if (fuser === undefined) {//This is always being called
            console.log("fuser is undefined");//For debug only
        }
    } catch(err) {
        console.log(err.message);
    }
    try {
        if (fuser !== undefined) {
            socket.emit('loginMessage', {status:true});

            socket.id = Math.random();
            SOCKET_LIST[socket.id] = socket;

            var player = Player(socket.id, fuser.Username, fuser.Rank, fuser.Points);
            PLAYER_LIST[socket.id] = player;
            return;
        }
        socket.emit('loginMessage', {status:false});
    } catch(err) {
        console.log(err.message);
    }
});

这是调用问题对象的函数,下面是database.js中的checkAccount()函数(如果有帮助,我已经包含了module.exports):
function checkAccount(username, password) {
con.query("SELECT * FROM Userbase WHERE Username='" + username + "' AND Password='" + password + "';", function(err, rows) {
    if (err) throw err;
    if (rows.length > 0) {
        var returnedUser = new User();
        returnedUser.Username = username;
        returnedUser.Password = password;
        returnedUser.Rank = rows[0].Rank;
        returnedUser.Points = rows[0].Points;
        return returnedUser; // This should return the User object however when run in my app.js it is undefined
    }
    return null;
});

}
module.exports.mysql = mysql;
module.exports.con = con;
module.exports.checkAccount = checkAccount;
module.exports.User = User;
module.exports.init = init;

任何帮助都将不胜感激!c:

最佳答案

您的function checkAccount(username, password) {没有返回值。
只有传递给query(query, callback)的函数返回一个值。由于查询函数是异步的,因此它应该返回promise或在调用准备就绪时调用回调。你应该在这里阅读更多关于回拨和承诺的内容:http://sporto.github.io/blog/2012/12/09/callbacks-listeners-promises/
根据您使用的数据库实现,查询函数可能会返回一个promise,而不是执行以下操作:

function checkAccount(username, password) {
    return con.query(...

以那种方式履行诺言
checkAccount(xxx).then(function(data) {
    // your data is here
});

关于javascript - 函数的返回值未定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40160475/

10-12 13:06