2015-11-03 2 views
0
app.get('/ratings', function (req, res){ 
db.database.find({rating:5}).count(function(err, doc) { 
    review.FiveStarCount=doc; 
});   
db.database.find({rating:4}).count(function(err, doc) { 
    review.FourStarCount=doc; 
}); 

Я новичок в использовании стека MEAN и пытается вернуть значения количества отзывов 5 и 4 звезды. Я могу получить число 5 звезд просто отлично, но когда я делаю несколько, я, кажется, сталкиваюсь с проблемами и не уверен, как настроить его.Как сохранить несколько значений запроса с помощью MongoDB и выразить?

+0

* Кажется, у меня проблемы с работой * Можете ли вы уточнить? – Rayon

+0

Хотя я не могу сказать, посмотрев на ваш код..find - это асинхронная функция - обратные вызовы не выполняются в том порядке, в котором вы их написали, они происходят в произвольные моменты времени. Если вы не используете защелку или обещание (или вложенные обратные вызовы), вы не сможете получить оба. Пожалуйста, поделитесь больше своего кода –

ответ

0

Вам необходимо получить представление о том, как обрабатывать поток управления при выполнении асинхронных операций. Выполнение функции не останавливается, в отличие от php, когда вы выполняете операцию async. Чтобы выполнить то, что вы пытаетесь сделать, второй вызов db должен быть внутри обратного вызова первого. Попробуйте это.

app.get('/ratings', function (req, res, next) { 
db.database.find({rating:5}).count(function(err, doc) { 
    // always handle error first 
    if (err) { 
     return next(err); 
    } 

    if (doc) { 
     review.FiveStarCount = doc; 
    } 

    db.database.find({rating:4}).count(function(err, doc) { 
     if (err) { 
      return next(err); 
     } 

     if (doc) { 
      review.FourStarCount = doc; 
     } 

     console.log(review.FiveStarCount, review.FourStarCount); 
    }); 
}); 

});

0

Так что, похоже, вы работаете против асинхронного характера JavaScript. в случае вышеперечисленных функций они не будут выполняться в том порядке, в котором вы написали (и вы тоже этого не хотели бы!), потому что они асинхронны. Есть несколько простых решений, которые помогут вам разобраться в проблеме.

Решение 1: Вложенные обратные вызовы. Трудно читать. Кроме того, он ждет завершения первого, прежде чем стрелять вторым, возможно, замедляя все.

app.get('/ratings', function(req, res) { 
    var review = {}; 
    db.database.find({rating:5}).count(function(err, doc) { 
    review.FiveStarCount = doc; 

    db.database.find({rating:4}).count(function(err, doc) { 
    review.FourStarCount = doc; 

    // DO something with data 
    res.json(review); 
    }); 
}); 

Решение 2: Защелка. Это имеет то преимущество, что запросы выполняются параллельно и не так ужасны для чтения.

app.get('/ratings', function(req, res) { 
    var review = {}; 

    db.database.find({rating:5}).count(function(err, doc) { 
    review.FiveStarCount=doc; 

    if (review.FiveStarCount && review.FourStarCount) { 
     // DO something here 
     // Will only execute if the other has finished 
    } 
    });   

    db.database.find({rating:4}).count(function(err, doc) { 
    review.FourStarCount=doc; 

    if (review.FiveStarCount && review.FourStarCount) { 
     // DO something here 
     // Will only execute if the other has finished 
    } 
    }); 

}); 

Есть, конечно, больше решений, таких как, возможно, лучший запрос или обещания. Возможно, прочитайте немного больше о async JavaScript here, чтобы получить лучшее понимание.

+0

В вашем втором решении, что, если другой не закончит? – Rayon