2016-05-17 14 views
1

Seit Stunden auf diesem Problem festgefahren. Der Code unten:Knoten JS mongoose Abfrage produziert nicht Ergebnis

router.route("/contact") 
    .get(function(req,res){ 
     var response = {}; 
     Contact.find({},function(err,data){ 
      if(err) { 
       response = {"error" : "Error fetching data"}; 
      } else { 
       response = {"message" : data}; 
      } 
      res.json(response); 
     }); 
    }) 

Above Abfrage erzeugt mit allen Kontakten in der Datenbank führen aber

router.route("/contact/department/:dept") 
    .get(function(req,res){ 
     var response = {}; 
     var arrDept = req.params.dept.split(","); 
     if(arrDept.length == 0){ 
      response = {"error": " Please enter Department keywords"}; 
     } 
     else{ 
      response = {}; 
      arrDept.forEach(function(currentValue){ 
       Video.find({dept: '/'+currentValue+'/i'}, function(err, data){ 
        if(err){ 
         response[currentValue] = "No data found"; 
        }else{ 
         response[currentValue] = data; 
        } 
       }); 
      }); 
     } 
     res.json(response); 
    }); 

dieser Code erzeugt keine Ausgabe.

Der Code ist die Eingabe der forEach Schleife in dem sonst blockieren, aber die Abfrage erzeugt kein Ergebnis, selbst wenn ich die Abfrage auf ein Basis einer wie

Video.find({},function(err, data){ 
        if(err){ 
         response[currentValue] = "No data found"; 
        }else{ 
         response[currentValue] = data; 
        } 
       }); 

Die Reaktion modifizieren JSON noch leer zurückgeführt wird.

PS: Das Problem wurde vereinfacht, da es nur ein Beispiel für das aktuelle Problem ist, mit dem ich im Code konfrontiert bin. Update nach Antwort gefunden.

Antwort

1

Ihr res.json(response); im nicht funktionierenden Beispiel befindet sich außerhalb des Rückrufs Ihrer MongoDB-Abfrage, dh Sie schreiben die Antwort, bevor der Rückruf der Abfrage tatsächlich ausgeführt wurde und daher Ihr Ergebnis leer ist.

+0

danke DAXaholic .... aber wie füge ich Daten von jeder Iteration der Schleife an die Antwort JSON-Objekt? –

+0

Um es ohne weitere Helfer-Bibliothek zu tun, könnten Sie z.B. pflege ein Array außerhalb des Callbacks mit den Ergebnissen und füge es dem Callback hinzu und sobald die Größe dieses Arrays gleich 'arrDept' ist, weißt du, dass du alle Ergebnisse erhalten hast. Aber um ehrlich zu sein, ist es viel einfacher und unkomplizierter, etwas wie async.js zu verwenden. Ein schnelles Beispiel dafür, was ich meine, finden Sie unter https://github.com/caolan/async#map. – DAXaholic

+0

thnx ... ich habe es endlich mit Versprechen gelöst. var promise = Kontakt.find ({dept: {$ in: arrayDept}}). exec(); \t \t \t promise.then (function (resultJson) { \t \t \t \t res.json (resultJson); \t \t \t}); –

2
res.json(response) 

wurde außerhalb der Abfrage geschrieben, weshalb eine leere JSON zurückgegeben wurde. Das obige Szenario kann mit Versprechen wie folgt gelöst werden:

var promise = Contact.find({ dept: { $in: arrayDept }}).exec(); 
promise.then(function(resultJson) { res.json(resultJson); }); 

Dieses verwendet werden können alle Abfragen in der Anordnung auszuführen und die komplette json zurückzukehren.