2015-08-25 20 views
5

Próbuję przejść przez wynik zapytania do mojego widoku w Express. Kwerenda jest wykonywana za pomocą mongodb, która zlicza wszystkie punkty zbiorczych użytkowników.Prześlij dane do widoku w Express

Gdy próbuję przejść przez liczbę jako zmienną, mam

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

który odnosi się do <% = totalpoints%> moim zdaniem Ejs. Poniżej znajduje się mój kod w 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 
    }); 

}); 

Jakieś pomysły, w jaki sposób mogę przekazać wynik zapytania?

Odpowiedz

6

Węzeł wykonuje zapytanie asynchronicznie. Oznacza to, że wynik zapytania nie jest natychmiast zwracany. Musisz poczekać aż wynik zostanie zwrócony, a do tego celu zostaną użyte wywołania zwrotne. Tak więc wywołanie strony renderującej musi nastąpić w ramach wywołania zwrotnego. Spróbuj zmodyfikować swoją funkcję w ten sposób.

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

Wątpię czy 'czeka res.render' till pętli jest zakończone – Vishnu

+0

@ServerSideSkittles Użyj' User.aggregate' za znalezienie sumowanie punktów zamiast dodawać w pętli for. http://mongoosejs.com/docs/api.html#aggregate-js – Vishnu

+4

@ Pętle 'for' są synchroniczne, więc tak,' res.render() 'będzie" czekać ". – robertklep

1

node.js jest asynchroniczna w przyrodzie, res.render zostanie wykonany, zanim pojawi się dane z mangusty. Spróbuj następującego kodu.

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

}); 
Powiązane problemy