2012-04-02 58 views
0

我是nodejs的新手,但是昨晚我在iisnode的IIS服務器上用mongodb獲得了一些東西。 :)nodejs&mongodb刷新錯誤?

但我想知道一件事似乎是一個刷新錯誤或什麼的。 當我在瀏覽器中訪問「http://localhost/mongo.js」時,結果第一次只是「[]」。如果我刷新結果將是我所期望的(與人有關的json數組)。 Dosen't這似乎錯了?

假設我現在用一個查詢「http://localhost/mongo.js?name = Daniel」來完成它,並獲取名稱爲Daniel的所有人員。第一次的迴應將是「所有人」,因爲這是我們上面要求的,而當我刷新時,結果將是所有名爲丹尼爾的人。 這是怎麼發生的? 似乎服務器緩存了我所做的查詢,而且我不想每次都刷新以獲取正確的結果。

這是我的代碼我使用:(也可以在這裏http://pastebin.com/PnVfrQmh

/* GLOBALS 
----------------------------------------------------------------------*/ 
var rdata = []; 

/* SERVER SETTINGS 
----------------------------------------------------------------------*/ 

//load http module to ceate an http server. 
var http = require('http'); 
var url = require('url'); 

//configure to respond http server with message 
http.createServer(function (request, response) { 

    //request name parameter 
    var url_parts = url.parse(request.url, true); 
    var query = url_parts.query; 

    //do the mongo 
    var mongo = require('mongodb'); 
    var db = new mongo.Db('nodedb', new mongo.Server('localhost', 27017, {}), {}); 

    db.open(function() { 

     db.collection('Persons', function(err, collection) { 

      var cursor = collection.find(query); 

      cursor.each(function(err, doc) { 

       if(doc) { 

        rdata.push(doc); 

       } 

      }); 

     }); 

    }); 

    //write what type of response 
    response.writeHead(200, {'Content-Type': 'application/json;charset=utf-8'}); 

    //return data json array 
    response.end(JSON.stringify(rdata)); 

    //clear rdata 
    rdata = []; 

}).listen(process.env.PORT); 

回答

4

你要記住,你總是在異步世界node.js中這讓我從更多的同步背景中獲益。

這裏發生了什麼是您的響應在邏輯運行之前返回。這是因爲當您撥打db.open(function() {時,這會在事件循環中返回。這是非阻塞的,因此運行的下一行代碼是response.writeHead(200, {'Content-Type': 'application/json;charset=utf-8'});。然後在未來某個時候調用db.open的回調。

爲了解決這個問題。在cursor.each(function(err, doc) {循環結束後返回響應。

希望這會有所幫助。