2016-09-20 3 views
1

Laut den verfügbaren Daten sollten Sie 2 reults bekommen, aber nur eins bekommen, da ich res.send in den loop gelegt habe, damit es beendet wird, kann mir bitte weiterhelfen ..... ..So führen Sie Forloop in Knoten aus js

exports.getrequestsdetails = function(req, res) { 
    var params = req.params; 
    console.log(params) 
    var record = db.collection('requests'); 
    var item = { 
     "sent_id": params.id, 
     "status": 1 
    } 
    record.find(item).toArray((err, result) => { 
     if (err) { 
      return 
     } 
     if (result) { 
      for (var i in result) { 
       var id = result[i].recieved_id; 
       var profile = db.collection('profile'); 
       profile.find({ 
        '_id': new ObjectId(id) 
       }).toArray((err, resp) => { 
        if (err) { 
         return 
        } 
        if (resp) { 
         console.log(resp); 
        } else {} 
       }); 
      } 
      res.send(resp); 
     } //end of if loop 
     else { 
      response = { 
       status: 'fail', 
       data: [] 
      }; 
     } 

    }); 

} 
+0

Was sind die Einträge im Listenfeld? – abdulbarik

+0

Hallo abdulbarik, ich habe meinen Code – klp

+0

mit res.Send (resp) editiert; Ich bekomme Fehler oder nicht definiert – klp

Antwort

1

Das Problem besteht darin, die Profile zu bekommen. Sie verwenden mongodb's find, welches asynchron ist. In Ihrem for Zyklus fangen Sie also an, die Profile abzurufen, aber dann senden Sie die res.send lange vor dem Abrufen der Profile aus.

Der Rückruf von profile.find(... wird ausgeführt nach der res.send. Abgesehen davon ist die resp Variable innerhalb des Callbacks und Sie versuchen, res.send es draußen.

Um damit umzugehen, verwenden Sie entweder async oder verspricht. Siehe den folgenden Code, der Versprechungen verwendet.

var Promise = require('bluebird') 

exports.getrequestsdetails = function(req, res) { 
    var params = req.params; 
    console.log(params) 
    var record = db.collection('requests'); 
    var item = { 
     "sent_id": params.id, 
     "status": 1 
    } 

    record.find(item).toArray((err, result) => { 
     if (err) { 
      return 
     } 
     if (result) { 

      var profiles_to_get = [] 
      var profiles = [] 

      for (var i in result) { 
       var id = result[i].recieved_id; 
       profiles_to_get.push(get_profile(id, profiles)) 
      } 

      Promise.all(profiles_to_get) 
       .then(() => { 
        res.send(profiles); 
       }) 
     } //end of if loop 
     else { 
      response = { 
       status: 'fail', 
       data: [] 
      }; 
     } 

    }); 

    function get_profile (id, profiles) { 
     return new Promise(function (resolve, reject) { 
      var profile = db.collection('profile'); 
       profile.find({ 
        '_id': new ObjectId(id) 
       }).toArray((err, resp) => { 
        if (err) { 
         reject(err) 
         return 
        } 
        if (resp) { 
         profiles.push(resp) 
         resolve() 
        } else { 
         reject() 
        } 
       }); 
     }) 
    } 

} 

Wie dies funktioniert, ist, dass es eine Liste der Profile erstellt, es zu finden und Geschäfte in der var profiles_to_get = []. Sie verwenden Promise.All(profiles_to_get), die Sie tun können, nachdem alle Profile abgerufen wurden.

+0

ich bekomme Fehler Unerwartete Token) – klp

+0

tut es sagen hast du eine Zeilennummer? –

+0

Das ist behoben, nw sagt es Versprechen.Alle ist keine Funktion – klp

1

Sie können nur eine Antwort zurück an eine Anfrage senden.

Definieren Sie eine Variable außerhalb der for-Schleife, hängen Sie Datensätze an sie an und senden Sie sie dann, nachdem die for-Schleife beendet wurde.

exports.getrequestsdetails = function(req, res) { 
var params = req.params; 
console.log(params) 
var record = db.collection('requests'); 
var item = { 
    "sent_id": params.id, 
    "status": 1 
} 

var resList = []; 

record.find(item).toArray((err, result) => { 
     if (err) { 
      return 
     } 
     if (result) { 
      for (var i in result) { 
       var id = result[i].recieved_id; 
       var profile = db.collection('profile'); 
       profile.find({ 
        '_id': new ObjectId(id) 
       }).toArray((err, resp) => { 
         if (err) { 
          return 
         } 
         if (resp) { 
          console.log(resp); 
          resList[i] = resp; 
         } 
         else{ 
         } 
       }); 
      } 
     }//end of if loop 
     else { 
      resList = { 
       status: 'fail', 
       data: [] 
       }; 
     } 
     res.send(resList); 
     }); 
+0

ca Sie bitte einige Code – klp

+0

Edited Code hinzufügen. –

+0

Es wird nicht funktionieren, wie können Sie bekommen "i" Wert aus dem Umfang – abdulbarik

0

Sie können in einem Array alle Liste hinzufügen und schließlich die Daten nach der Schleife senden

1

Sie können push alle resp in list Array und senden loop nach Abschluss.

So:

exports.getrequestsdetails = function(req, res) { 
    var params = req.params; 
    console.log(params); 

    var record = db.collection('requests'); 
    var item = { 
     "sent_id": params.id, 
     "status": 1 
    }; 

    record.find(item).toArray((err, result) => { 
     if (err) { 
      return err; 
     } 
     if (result) { 
      var list = []; 
      for (var i in result) { 
       var id = result[i].recieved_id; 
       var profile = db.collection('profile'); 
       profile.find({ 
        '_id': new ObjectId(id) 
       }).toArray((err, resp) => { 
        if (err) { 
         return err; 
        } 
        else{ 
         list.push(resp); 
         console.log(resp); 
         if(i===result[result.length-1]){ 
          res.send(list); 
         } 
        } 
       }); 
      } 

     } //end of if loop 
     else { 
      response = { 
       status: 'fail', 
       data: [] 
      }; 
     } 

    }); 
}; 

Hoffnung diese Arbeit für Sie

+0

sehen, aber wo soll ich res.send (resp) halten? – klp

+0

Es liegt an Ihnen, wenn Sie die Res senden möchten? – abdulbarik

+0

Jetzt sendet es nach Abschluss der for-Schleife – abdulbarik

1

nicht für Schleife im asynchronen Modus anwenden. Verwenden Sie stattdessen asynchrone Module wie unten.

var async = require('async'); 
exports.getrequestsdetails = function (req, res) { 
    var params = req.params; 
    console.log(params) 
    var record = db.collection('requests'); 
    var item = { 
     "sent_id": params.id, 
     "status": 1 
    } 
    record.find(item).toArray(function (err, result) { 
     if (err) { 
      return 
     } 
     if (result) { 
      var list = []; 
      async.each(result, function (item, cb) { 
       var id = item.recieved_id; 
       var profile = db.collection('profile'); 
       profile.findOne({ 
        '_id': new ObjectId(id) 
       }, function (err, resp) { 
        if (err) { 
         return cb(); 
        } 
        if (resp) { 
         list.push(resp); 
         console.log(resp); 
         return cb(); 
        } 
        return cb(); 
       }); 
      }, function (err) { 
       res.send(list); 
      }); 
     }//end of if loop 
     else { 
      response = { 
       status: 'fail', 
       data: [] 
      }; 
     } 

    }); 

} 
Verwandte Themen