2017-07-15 1 views
1

Ich bin wirklich verwirrt darüber, wie Versprechen und asynchrone Javascript funktionieren. Ich möchte einen GET on/user ausführen und mongo abfragen, so dass das Ergebnis der ersten Abfrage in irgendeiner Weise verarbeitet wird, um die Abfrage der zweiten Abfrage zu bilden, und das Ergebnis dieser Abfrage die Abfrage der dritten Abfrage sein wird.Wie verwenden Sie Versprechen/Rückrufe mit Expressjs und Mongodb?

Grundsätzlich möchte ich das Ergebnis des letzten Mongo-Ergebnisses über res.send (result) an den Client zurücksenden.

Was ist der richtige Weg, dies zu tun, damit der Client eine 200 OK zurück mit dem Ergebnis der dritten verschachtelten Mongo-Abfrage bekommt?

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() 
           } 
          }) 
         } 
        }) 
       } 
      } 
     }); 
    }); 

Antwort

2

Angenommen Sie haben das regelmäßige Mongo-Client für Knoten verwenden, es gibt bereits Zusagen für Abfragen, das heißt, Sie können einfach die nächste Abfrage zurückgeben und es in einem then zu fangen, oder einen Fehler am Ende fangen mit catch .

Ungeprüfte, aber etwas ähnliches wie dies sollte

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); 
    }); 
}); 

Hinweis arbeiten, die Methoden wie toArray automatisch ein Versprechen zurück, wenn keine Callback-Funktion übergeben wird.

+0

Fügen Sie einfach einen res.status (200) für den gewünschten 200-Statuscode hinzu. – JonLuca

+0

@ JonLuca - Das würde erfordern, dass ich einige Funktionen und Sachen hinzufügen, aber okay ... – adeneo

+0

@adeneo Danke! Ich habe eine weitere Follow-up-Frage dazu, wenn Sie bitte einen Blick darauf werfen können: https://stackoverflow.com/questions/45123212/nodejs-how-do-i-condictive-restart-the-promise-chain-from-the -Anfang – noobprogrammer