2017-07-28 3 views
-2

私が言ったように、引数、ユーザー名、電子メールを持つ関数を作成したいと思います。そのうちの1つがデータベースにある場合、ユーザーは登録できません。関数は、mongooseのdababaseからドキュメントを検索するときに、未定義を返します。

function checkAll(username, email) { 
    let num = 0; 
    User.find({}, (err, result) => { 
    if (err) throw err; 
    for (let i = 0; i < result.length; i++) { 
    if (username === result[i].username || email === result[i].email) { 
     num++; 
     } 
    } 
    db.close(); 
    if (num == 0) { 
     return true; 
    } 
    return false; 
    }); 
} 

console.log(checkAll("test", "[email protected]")); 

私はUser.find()はそれがコールバックですが、私の質問であることを第二引数を持つ非同期関数であることを知っている:なぜそれはundefinedを返すんの? find操作のコールバックの前に

+1

非同期関数であり、非同期関数からそのように返ることができないため、 – MinusFour

答えて

0

機能checkAll仕上げの実行がトリガされ、そしてあなたがcheckAllから何かを返されていないので、undefinedがログに記録されます。

これは、それをより明確にする必要があります

function checkAll(username, email) { 
    let num = 0; 
    User.find({}, (err, result) => { 
    console.log('here'); 
    if (err) throw err; 
    for (let i = 0; i < result.length; i++) { 
    if (username === result[i].username || email === result[i].email) { 
     num++; 
     } 
    } 
    db.close(); 
    if (num == 0) { 
    console.log('now here'); 
     return true; 
    } 
    console.log('or mebbe here'); 
    return false; 
    }); 
} 

console.log(checkAll("test", "[email protected]")); 

あなたはそれがreturn文を持っていないのでundefinedを返しcheckAllundefined、その後here、その後now here OR or mebbe here

0

あなたの外側の関数が表示されます。あなたの内部関数だけ、あなたのmongoクエリへのコールバックがあります。クエリの非同期性のため、単にtrueまたはfalseを返すことはできません。あなたのオプションは、基本的にはこれです:

checkAllにコールバック(または2)を渡します。あなたは、元の呼び出し場所に戻って実行を送信し、クエリのコールバック内からtrueまたはfalseとcbを呼び出す

function checkAll(username, email, cb){ //... 
function checkAll(username, email, cb_success, cb_fail){ //... 

create_userが関数であることは、成功事例を処理し、user_existsが障害ケースを処理する関数である

function checkAll(username, email){ 
    return new Promise((resolve, reject)=> { 
     User.find({$or: [{username}, {emai}]}, (err, result)=>{ 
      if(result) reject('User exists'); 
      else resolve('Username/ email free'); 
     }); 
    }; 
} 

// Usage: 
checkAll('alice', '[email protected]').then(create_user, user_exists); 

は約束を使用してください。

+0

ありがとうございました。うまくいきました。 – Matin

+0

素晴らしい!これが解決策であれば、[同意してください](https://stackoverflow.com/help/accepted-answer) – Will

関連する問題