【问题标题】:Return value for a function is undefined函数的返回值未定义
【发布时间】:2017-03-02 19:27:10
【问题描述】:

我已经被困了一段时间,我不知道出了什么问题。我有一个名为 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:

【问题讨论】:

    标签: javascript mysql node.js socket.io


    【解决方案1】:

    您的function checkAccount(username, password) { 没有返回值。

    只有你传递给query(query, callback) 的函数才会返回一个值。由于查询函数是异步的,它应该返回promise 或在调用准备好时调用回调。您应该阅读有关回调和承诺 f.e. 的更多信息。这里:http://sporto.github.io/blog/2012/12/09/callbacks-listeners-promises/

    根据您使用的数据库实现,查询函数可能会返回一个承诺,而不是您可以这样做:

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

    并以这种方式使用承诺

    checkAccount(xxx).then(function(data) {
        // your data is here
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      相关资源
      最近更新 更多