#node.js #mongodb #mongoose
#node.js #mongodb #mongoose
Вопрос:
Как я могу вернуть количество документов, возвращенных запросом? У меня есть файл маршрутизации, который содержит следующий код:
router.post('/facebookLogin', function(req, res, next){
var User=require('../models/user');
var a=User.facebookUserExist(req.body.id, req.body.email);
console.log(a);
res.end();
});
И вот содержимое файла модели пользователя:
var User=function(data){
this.data=data;
}
User.prototype.data={};
User.prototype.facebookUserExist=function(id, email){
var output;
db.collection('users').find({
$or:[
{
facebookID:id
},
{
email:email
}
]
}).count(function(err, numOfDocs){
output=numOfDocs;
});
return output;
}
module.exports=new User;
Я установил значение выходной переменной в обратном вызове метода count, но функция по-прежнему возвращает undefined .
Комментарии:
1. 1. вам не нужно использовать
find
иcount
, вы можете использовать толькоcount
с тем же фильтром. 2. вы используете метод обратного вызова как асинхронный метод, поэтому вы получаете undefined .
Ответ №1:
Мы знаем, что JavaScript является асинхронным и не будет ждать результата. Итак, вы можете использовать обратный вызов или объект Promise, вот пример обратного вызова для вашего кода
router.post('/facebookLogin', function(req, res, next){
var User=require('../models/user');
User.facebookUserExist(req.body.id, req.body.email, function(err, count)
if(err)
console.log('Error ', err);
else
console.log(count);
res.end();
});
});
и ваша пользовательская модель принимает обратный вызов в качестве последнего аргумента
var User=function(data){
this.data=data;
}
User.prototype.data={};
User.prototype.facebookUserExist=function(id, email, callback){
var output;
db.collection('users').find({
$or:[
{
facebookID:id
},
{
email:email
}
]
}).count(function(err, numOfDocs){
callback(err, numOfDocs);
});
//return output;
}
module.exports=new User;
Комментарии:
1. Я не могу заставить код ждать возвращаемого значения функции?
2. Когда я пытаюсь использовать объект promise, он всегда находится в состоянии ожидания, а метод then не выполняется.
3. Оператор возврата @kukko не будет ждать завершения вашей функции. Вы можете использовать либо обратный вызов (как я объяснил в своем ответе), либо объект Promise
Ответ №2:
.count() требуется для получения общего количества документов в MongoDB. Это может помочь.
USER.find(req.body.id, req.body.email).count(function(err, count) {
console.log("Number of docs: ", count); });