数据库查询的回调函数不返回任何内容

时间:2017-02-25 20:23:01

标签: javascript node.js asynchronous

所以我这样做:

module.exports.checkEmailInUse = (email) => {

    connection.query('SELECT `id` FROM `users` WHERE email = ?',
        [
            email
        ],
        function(err, rows, fields) {


            console.log(rows.length);


            if(rows.length > 0){

                return true;

            }
            else{

                return false;

            }

       }
    );



}

此表格为空白。我得到0就应该回来了。但在其他文件中,我这样做:

if(Database.checkEmailInUse(email)){

    callback({success: "false", message: "Email Already In Use"});

    return false;
}

这不应该开火,因为这会返回0 ....但确实如此。

但现在如果我将它们作为字符串返回:

return "true";

if(Database.checkEmailInUse(email) == "true")

它会起作用。

这是我第一个使用NodeJS的项目,我在这里难倒。

修改 回答。谢谢qqilihq !! :

module.exports.checkEmailInUse = (email) => {

var queryTheEmail = (email, callback)=>{

    connection.query('SELECT `id` FROM `users` WHERE email = ?',
        [
            email
        ],
        function(err, rows) {

            if (err) {
                callback(err,null);
            }

            else{
                callback(null,rows);
            }


        }
    );

}

queryTheEmail(email, (err, rows) => {


    if (err) {

        console.error('SQL error: ', err);
        return false;

    }

    if(rows.length > 0){

        return true;

    }
    else{

        return false;

    }


});


}

1 个答案:

答案 0 :(得分:2)

问题是,您的checkEmailInUse函数实际上返回 nothing 。数据库查询异步发生:检查函数的嵌套。作为(简化)经验法则:异步是病毒 - 只要您的代码包含异步部分,利用它的所有内容都需要处理异步。

您需要重构此操作,以使用回调或返回承诺。以下示例显示了如何使用回调(以及一些额外的代码清理)来执行此操作:

module.exports.checkEmailInUse = (email, callback) => {
    connection.query('SELECT `id` FROM `users` WHERE email = ?',
        [
            email
        ],
        function(err, rows, fields) {
            if (err) return callback(err);
            callback(null, rows.length > 0);
        }
    );
}

然后,使用checkEmailInUse函数,如下所示:

Database.checkEmailInUse(email, function(err, exists) {
    if (err) {
        return callback({success: "false", message: "Error when checking the DB"});
    }
    if (exists) {
        callback({success: "false", message: "Email Already In Use"});
    } else {
        callback({success: "true", message: "Come in!"});
    }
});

有一次,您对异步概念越来越熟悉并且您的代码库不断增长,为了避免所谓的“回调地狱”,我们值得考虑引入承诺。并使您的代码更具可读性(或使用async.js等帮助程序)。

无论哪种方式,这都与布尔无关,特别是原始问题标题假设。

相关问题