2017-07-15 16 views
1

私は約束と非同期javascriptの仕事について本当に混乱しています。私は/ userとquery mongoでGETを行い、最初のクエリの結果が何らかの方法で処理されて2番目のクエリのクエリを形成し、そのクエリの結果が3番目のクエリのクエリになるようにしたい。expressjsとmongodbを使用して約束/コールバックを使用するには?

基本的には、最終的なmongo結果の結果をres.send(result)を介してクライアントに送り返したいと思います。

これを実行する適切な方法は、クライアントが3番目のネストされたmongoクエリの結果で200 OKを返すようにすることです。

app.get('/user', function (req, res, next) { 

    var query = {"isRegistered": false } 

    db.collection('users', function (err, collection) { 
     collection.find(query).toArray(function (err, result) { 
      if (err) { 
       console.log(err) 
      } 
      else { 
       if (result.length > 0) { 
        // do some random processing 
        var randomUser = result[Math.floor(Math.random() * result.length)] 
        // do ANOTHER db query 
        query = {"age": randomUser.age} 
        collection.find(query).toArray(function (err,result) { 
         if (err) { 
          console.log(err) 
         } 
         else { 
          // do some other logic ... 
          query = {something} 
          collection.find(query).toArray(function (err,result) { 
           if (err) { 
           console.log(err); 
           } 
           else { 
            // FINALLY RETURN THIS RESULT 
            res.send(result); 
            next() 
           } 
          }) 
         } 
        }) 
       } 
      } 
     }); 
    }); 

答えて

2

あなたはノードのための定期的なモンゴクライアントを使用していると仮定すると、それはすでにあなただけcatchで終わり、次のクエリを返し、thenでそれをキャッチし、またはエラーをキャッチすることができることを意味し、クエリのための約束を返します。 。

テストされていないが、これに似たものには、コールバック関数が渡されない場合toArrayのようなメソッドが自動的に約束を返し

app.get('/user', function (req, res, next) { 

    var query = {"isRegistered" : false }; 
    var collection = db.collection('users'); 

    collection.find(query).toArray().then(result => { 
     var randomUser = result[Math.floor(Math.random() * result.length)]; 
     var query2  = {"age" : randomUser.age}; 

     return collection.find(query2).toArray(); 
    }).then(result => { 
     var query3 = {something : 'something'}; 

     return collection.find(query3).toArray(); 
    }).then(result => { 
     res.status(200); 
     res.send(result); 
    }).catch(err => { 
     console.log(err); 
     res.status(500); 
    }); 
}); 

注意を動作するはずです。

+0

追加するだけで、必要な200のステータスコードに対してres.status(200)を実行します。 – JonLuca

+0

@JonLuca - それに私はもっと多くの機能やものを追加する必要がありますが、大丈夫です。 – adeneo

+0

@adeneoありがとう!私はあなたが見てみることができる場合は、これに関連する別のフォローアップの質問があります:https://stackoverflow.com/questions/45123212/nodejs-how-do-i-conditionally-restart-the-promise-chain-from-the始める – noobprogrammer

関連する問題