2016-12-11 2 views
0

Hallo habe ich diesen Code in node.js, in dieser Ich weiß, eine Suchabfrage mit MungoFehler nicht gesetzt Eigenschaft undefined

router.post('/query',function(req,res,next){ 
    if (req.body){ 
     var result=[]; 
     console.log(req.body.filters); 
     Pollee.find(req.body.filters) 
     .select('id age birthday user') 
     .populate('user','email') 
     .lean(true) 
     .exec(function(err,pollees){ 
      if(err) { 
       console.log(err); 
       return next(err); 
      } 
      for (var i = 0; i < pollees.length; i++){    
      var query = test(pollees[i]._id); 
      query.exec(function(err,inters){ 
       if(err) 
        return console.log(err); 
       inters.forEach(function(inter){ 
        pollees[i].interaction = inter; 
       }); 
      }); 
      } 
      res.json(pollees);  
      }; 
     }) 
    } 
}); 

function test(id){ 
    var promise = Interaction.find({pollee:id}).select('status other'); 
    return promise; 
} 

Mein Problem hier seine im Interaction.find wenn ich versuche, das passieren Ergebnisse dieser Abfrage auf pollees [i] .interaction = inter; die Konsole setzt mich Fehler

Kann Eigenschaft pollees nicht setzen [i] .interaction = inter; von undefined

Irgendeine Idee?

Die verwendeten Modelle I

var interactionSchema = new Schema({ 
    pollee: { type: ObjectId, ref: 'Pollee' }, 
    answers: { type: [ObjectId], ref: 'Answer', autopopulate: true }, 
    status: type: String 
}); 

var PolleeSchema = new Schema({ 
    firstName: String, 
    lastName: String, 
    gender: String, 
    user: { type: ObjectId, ref: 'User', required: true }, 
    interactions: { type: [ObjectId], ref: 'Interaction', autopopulate: true } 
}); 

var userSchema = new Schema({ 
    email: String, 
    pollee: { type: Schema.Types.ObjectId, ref: 'Pollee', autopopulate: true } 
}); 

Vielen Dank!

Antwort

0

Ich würde das Problem das folgende sagen: in der for Zyklus Ihres Codes rufen Sie asynchrone Methode query.exec(). Zu dem Zeitpunkt, zu dem es seinen Callback ausführt, ist der Zyklus bereits beendet und der Wert i === pollees.length ist erreicht. So zeigt pollees[i] auf nicht vorhandene Array-Element (undefiniert) und Sie erhalten einen Fehler "kann nicht die Eigenschaft von nicht definiert festlegen", wenn Sie versuchen, seine Eigenschaft interaction zu setzen. Einer der Wege, dies zu beheben wäre .bind zu verwenden:

query.exec(function(i, err,inters){ //i is among the params in your callback 
    if(err) 
     return console.log(err); 
    inters.forEach(function(inter){ 
     pollees[i].interaction = inter; 
    }); 
}.bind(null, i)); //you're binding the variable 'i' to the callback 

EDIT:

Und damit res.json(pollees); arbeiten (das ist ein anderes Problem ist), sollten Sie wickeln alle Ihre Rückrufe in ein Promise . Es sollte wohl aussehen etwas wie folgt aus:

var queries = []; //an array of promises 
for (var i = 0; i < pollees.length; i++){    
    queries.push(test(pollees[i]._id)); //add a promise to the array 
} 
//wait for all promises to resolve 
Promise.all(queries).then(function(results) { 
    results.forEach(function(inter, index){ 
     pollees[index].interaction = inter; 
    }); 
    res.json(pollees); //return response 
}); 
+0

Werke aber Befragten seine ohne Wechselwirkungsfeld zurück – ZizouJd

+0

sicher, weil Sie Rückkehr die Antwort, bevor die Rückrufe auch – anytimecoder

+0

aktualisiert meine Antwort für dieses Problem ausgeführt werden sollen – anytimecoder

Verwandte Themen