nodejs& mongodb刷新bug?

时间:2012-04-02 06:57:32

标签: node.js mongodb

我是nodejs的新手,但我确实在昨晚使用iisnode在IIS服务器上使用mongodb工作。 :)

但我想知道一件事似乎是一个刷新错误或其他什么。 当我去" http://localhost/mongo.js"在我的浏览器中,结果将是" []"第一次。如果我点击刷新,结果将是我所期望的(带有人的json数组)。 Dosen这似乎不对?

现在让我们说一下查询," 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); 

1 个答案:

答案 0 :(得分:4)

您必须记住,您始终与node.js处于异步世界。这也引起了我的同步背景。

这里发生的是您的响应在逻辑运行之前返回。这是因为当你调用db.open(function() {时,这会在事件循环中继续并返回。这是非阻塞的,因此运行的下一行代码是response.writeHead(200, {'Content-Type': 'application/json;charset=utf-8'});。然后在将来的某个时间调用db.open的回调。

为了纠正这个问题。在cursor.each(function(err, doc) {循环结束后返回响应。

希望这有帮助。