2015-08-25 6 views
5

Ich versuche, das Ergebnis einer Abfrage zu meiner Ansicht in Express zu übergeben. Die Abfrage erfolgt mit mongodb, die die Gesamtpunkte der kollektiven Benutzer zählt.Übergeben von Daten an die Ansicht in Express

Wenn ich versuche, die Zählung durch eine Variable übergeben, ich

ReferenceError: /Sites/test/views/dashboard.ejs:76 

, die auf <% bezieht = totalpoints%> in meiner ejs Ansicht. Unten ist mein Code in app.js

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

    User.find({}, function(err, docs) { 
     console.log(docs); 
    }); 

    User.find({ 
     points: { 
      $exists: true 
     } 
    }, function(err, docs) { 
     var count = 0; 
     for (var i = 0; i < docs.length; i++) { 
      count += docs[i].points; 
     } 
     return count; 

     console.log('The total # of points is: ', count); 
    }); 

    var totalpoints = count; 

    res.render('dashboard', { 
     title: 'Dashboard', 
     user: req.user, 
     totalpoints: totalpoints 
    }); 

}); 

Irgendwelche Ideen, wie ich durch das Abfrageergebnis passieren kann?

Antwort

6

Knoten führt die Abfrage asynchron aus. Das heißt, das Ergebnis der Abfrage wird nicht sofort zurückgegeben. Sie müssen warten, bis das Ergebnis zurückgegeben wird, und Callbacks werden dazu verwendet. So muss der Aufruf der Renderseite innerhalb des Callbacks erfolgen. Versuchen Sie, Ihre Funktion so zu ändern.

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

    User.find({}, function(err, docs) { 
     console.log(docs); 
    }); 

    User.find({ 
     points: { 
      $exists: true 
     } 
    }, function(err, docs) { 
     if(err){ 
      console.log(err); 
      //do error handling 
     } 
     //if no error, get the count and render it 
     var count = 0; 
     for (var i = 0; i < docs.length; i++) { 
      count += docs[i].points; 
     } 
     var totalpoints = count; 
     res.render('dashboard', { 
     title: 'Dashboard', 
     user: req.user, 
     totalpoints: totalpoints}); 
    }); 


}); 
+0

ich zweifle, ob 'res.render' wartet Schleife bebauen abgeschlossen ist – Vishnu

+0

@ServerSideSkittles Verwenden' User.aggregate' für die Summe der Punkte zu finden, anstatt für Schleife in einem hinzuzufügen. http://mongoosejs.com/docs/api.html#aggregate-js – Vishnu

+4

@Mahesh 'for' Schleifen sind synchron, also ja,' res.render() 'wird" warten ". – robertklep

1

Node.js ist asynchron in der Natur, wird res.render ausgeführt werden, bevor Sie Daten aus dem Mungo erhalten. Probieren Sie den folgenden Code aus.

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

    User.find({}, function(err, docs) { 
     console.log(docs); 
    }); 

    User.aggregate({ $group: { 
    _id: null, 
    count: { $sum: "$points" } 
    }}, function(err, docs) { 
     if(err){ 
      console.log(err); 
      //do error handling 
     } 
     else 
      res.render('dashboard', { 
      title: 'Dashboard', 
      user: req.user, 
      totalpoints: docs.count }); 
     } 
); 

});