2015-01-05 78 views
0

我想從數據庫中使用nodejs獲取記錄的數量,但問題是由於同步請求,我無法打印它們。當我嘗試在函數內部打印它時,它打印的很好,但是在函數之外,它沒有。我知道這是由於JS的同步行爲,但我想這樣做(可能是異步)。我對Javascript和nodejs非常陌生,所以請指導我如何做到這一點。這裏是代碼。NodeJS同步調用

router.post('/numofrecs', function(req, res) { 

     var db = new Db('nmydb', new Server('localhost', '27017')); 
     db.open(function (err, db) { 
     db.authenticate('', '', function (err, result) { 


      var url = 'mongodb://localhost:27017/nmydb'; 
      client.connect(url, function (err, db) { 
       que = new Array(); 
       var questioncol = db.collection('allquestions'); 
       questioncol.find({}).count(function (err, data) { 
        rec = data; 
        console.log("Num of rec:"+rec); 
        //inside the connect function , it prints fine here 
       }); 

       console.log('Num of rec:'+ rec); 


//but it doesnot print here outside the connect function and just print "undefined" 
+1

您的問題是由於您正在使用的數據庫連接器的* asynchronous *性質造成的。除非該連接器提供了同步替代方案,否則您嘗試執行的操作無法完成。 –

+0

真的:(它不能做到) – Despicable

+1

對,所有依賴'rec'的代碼都需要在回調函數中,除非連接器提供了一個同步選項。 –

回答

1

既然你正在構建一個HTTP服務器,你不想讓你的服務器上的任何同步操作,因爲這種行爲會導致你的服務器的同步動作時不響應所有客戶端。相反,你應該在db查詢的回調中完成你所需要的工作。

router.post('/numofrecs', function(req, res) { 
    var db = new Db('nmydb', new Server('localhost', '27017')); 
    db.open(function (err, db) { 
     db.authenticate('', '', function (err, result) { 
      var url = 'mongodb://localhost:27017/nmydb'; 
      client.connect(url, function (err, db) { 
       var que = new Array(); 
       var questioncol = db.collection('allquestions'); 
       questioncol.find({}).count(function (err, data) { 
        console.log("Num of rec:"+data); 
        // do stuff with data here. 
        doStuff(data); 
       }); 
      }); 
     }); 
    }); 
}); 

不要忘記var您的變量。