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

Javascript 数据库查询的回调函数不返回任何内容,javascript,node.js,asynchronous,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);

所以我这样做:

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;

            }

       }
    );



}
if(Database.checkEmailInUse(email)){

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

    return false;
}
这张桌子是空的。我得到了应返回的0。但在另一个文件中,我这样做:

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;

            }

       }
    );



}
if(Database.checkEmailInUse(email)){

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

    return false;
}
这不应激发,因为它返回0。。。。但确实如此

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

return "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;

    }


});


}

问题是,您的
checkEmailInUse
函数实际上不返回任何内容。DB查询是异步进行的:检查函数的嵌套。作为(简化的)经验法则:异步是病毒式的——只要代码包含异步部分,使用它的一切都需要考虑异步

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

然后,按如下方式使用
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之类的帮助程序)


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

问题是,您的
checkEmailInUse
函数实际上没有返回任何内容。DB查询是异步进行的:检查函数的嵌套。您需要重构它,以使用回调或返回承诺。不管怎样,这都与布尔无关。专业的离题提示:如果你发现自己在返回true或false,那么这可能是不必要的代码。你的
if(rows.length>0).
可以被
return rows.length>0
@LiamGray替换,这就是我最初拥有的,并且从lol开始就一直在对这个问题进行垃圾射击。@qqilihq我认为
函数(err,rows,fields){
是对查询的回调。好的,现在开始研究它。谢谢。是的,但从那时起,您必须保持异步性质。简单地说:只要代码的某些部分包含async.parts,所有内容都将变为异步。@user2287474不客气!我将编辑问题的标题,这可能对mor有所帮助e有类似问题的人。