2017-02-25 165 views
2

所以我这样做:回调函数没有返回

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; 

    } 


}); 


} 
+2

问题是,你的'checkEmailInUse'函数实际上什么都没有返回。数据库查询异步发生:检查函数的嵌套。你需要重构这个,使用回调或者返回promise。无论哪种方式,这对布隆班特别具有*无关。 – qqilihq

+1

专业题外小贴士:如果你发现自己做了一个返回true否则它可能是不必要的代码。你的'if(rows.length> 0)...'可以被'return rows.length> 0'替代' –

+0

@LiamGray这就是我最初的做法,并且自从lol以来一直在对这个问题进行垃圾处理。 – user2287474

回答

2

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

您需要重构这个,以使用回调或返回承诺。下面的示例演示了如何使用回调(和一些额外的代码清理)做到这一点:

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之类的助手),值得考虑引入promise。

无论哪种方式,这与布尔值无关,特别是原来的问题标题。

+0

这为我清除了很多。谢啦! – user2287474

+1

@ user2287474不客气!我会编辑问题的标题,这可能会对更多有类似问题的人有帮助。 – qqilihq

相关问题