2012-04-02 85 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) {循环结束后返回响应。

希望这会有所帮助。