2017-02-25 12 views
2

返しません。私はそれが返すように0を返します。しかし、この他のファイルでは、私はこれを行います:コールバック関数は、だから私はこれを行うに何も

これは0を返すので、これを行うべきではありません。

しかし、今、私のような文字列としてそれらを返す場合:

return "true"; 

と:

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

それは動作します。

これはNodeJSの私の最初のプロジェクトで、ここで困惑しています。

EDIT ANSWER。ありがとう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'関数が実際に何も返さないということです。 DBクエリは非同期的に発生します。関数のネストをチェックします。コールバックを使用するか、約束を返すために、これをリファクタリングする必要があります。いずれにせよ、これはとりわけブーリアンとは何も関係ありません。 – qqilihq

+1

オフトピック側のヒント:あなたが自分自身が本当にelse falseを返していることが分かった場合は、おそらく不要なコードです。あなたの 'if(rows.length> 0)...'は 'return rows.length> 0' –

+0

@LiamGrayに置き換えることができます。これは私が最初にしていたもので、LOL以来の問題で酷いことをしています。 – user2287474

答えて

2

問題がある、あなたのcheckEmailInUse機能は、実際には何もを返しません。 DBクエリは非同期的に発生します。関数のネストを確認します。経験則として、非同期はウイルス性である - コードに非同期部品が含まれるとすぐに、それを利用するものはすべて非同期処理もする必要があります。

コールバックを使用するか約束を返すには、これをリファクタリングする必要があります。例に続いて、コールバック(およびいくつかの追加のコードのクリーンアップ)を使用して、それを行う方法を示しています。

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のようなヘルパーを使う)ことを約束することを検討する価値があります。

いずれにしても、これは最初の質問タイトルが仮定されているため、特にブール値とは関係ありません。

+0

これは私のために多くをクリアしました。ありがとう! – user2287474

+1

@ user2287474ようこそ。質問のタイトルを編集します。これにより、同様の問題を抱えている人が増えるほど役に立ちます。 – qqilihq

関連する問題