2016-10-02 65 views
0

如何返回查詢返回的文檔數? 我有一個路由文件,它有以下代碼:在NodeJS中使用貓鼬返回文檔數

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; 

餘設置的輸出變量的值的計數方法回調,但該函數仍然返回undefined。

+2

1.你不需要使用'find'和'count',你可以用同樣的過濾器使用'count'。 2.您使用回調方法作爲異步方法,這就是爲什麼你會得到未定義的。 – TomG

回答

1

我們知道JavaScript是異步的,不會等待結果。所以,可以選擇使用回調或承諾對象,我這裏是回調的爲您的代碼

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; 
+0

我不能讓代碼等待函數返回值? – kukko

+0

當我嘗試使用promise對象時,它總是處於掛起狀態,然後方法不執行。 – kukko

+0

@kukko return語句不會等待你的函數完成。您可以使用回調(正如我在答案中所解釋的)或Promise對象 –

0

.Count中()來獲得MongoDB中的總文檔。它可能有幫助。

USER.find(req.body.id, req.body.email).count(function(err, count) { 
    console.log("Number of docs: ", count); });