Вернуть количество документов с помощью mongoose в NodeJS

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