函数的返回值未定义

时间:2016-10-20 17:08:43

标签: javascript mysql node.js socket.io

我被困在这一段时间,我不知道出了什么问题。我有一个名为Databse.js的独立类,它运行MySQL函数,它管理连接,查询等。我一直试图让它从它应该返回的1行中获取信息(具有正确用户名和密码的用户)但是它说变量是未定义的。如果我在返回之前记录函数中的对象字段,它们都可以正常工作。

以下是具有更多上下文的代码:

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);
    }
});

这是调用故障对象的函数,这里是Databse.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:

1 个答案:

答案 0 :(得分:1)

您的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
});