2017-02-25 126 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

相關問題