2015-08-25 18 views
5

Tôi đang cố gắng chuyển qua kết quả truy vấn thông qua chế độ xem của tôi trong Express. Truy vấn được thực hiện bằng cách sử dụng mongodb tính tổng số điểm của người dùng tập thể.Chuyển dữ liệu đến chế độ xem trong Express

Khi tôi cố gắng vượt qua số lượng thông qua như là một biến, tôi nhận được

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

đó đề cập đến <% = totalpoints%> theo quan điểm của tôi EJS. Dưới đây là mã của tôi trong 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 
    }); 

}); 

Bất kỳ ý tưởng nào tôi có thể chuyển kết quả truy vấn qua?

Trả lời

6

Nút thực hiện truy vấn không đồng bộ. Đó là, kết quả của truy vấn không được trả về ngay lập tức. Bạn phải chờ cho đến khi kết quả được trả về và các cuộc gọi lại được sử dụng để thực hiện điều này. Do đó, cuộc gọi trang kết xuất phải xảy ra trong cuộc gọi lại. Hãy thử sửa đổi chức năng của bạn như thế này.

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

Tôi nghi ngờ liệu 'chờ đợi res.render' cày vòng lặp for được hoàn thành – Vishnu

+0

@ServerSideSkittles Sử dụng 'User.aggregate' cho việc tìm kiếm tổng điểm thay vì thêm vào một vòng lặp for. http://mongoosejs.com/docs/api.html#aggregate-js – Vishnu

+4

@Mahesh 'for' loops là đồng bộ, vì vậy có,' res.render() 'sẽ" chờ ". – robertklep

1

Node.js là không đồng bộ trong tự nhiên, res.render sẽ được thực thi trước khi bạn nhận dữ liệu từ mongoose. Hãy thử đoạn mã sau.

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

}); 
Các vấn đề liên quan