2012-04-02 13 views
0

Ich bin neu bei Nodejs, aber ich habe letzte Nacht mit mongodb auf einem IIS-Server mit Iisnode etwas zum Arbeiten bekommen. :)nodejs & mongodb Aktualisierungsfehler?

Aber ich wundere mich über eine Sache, die ein Refresh-Bug oder etwas zu sein scheint. Wenn ich in meinem Browser zu "http: //localhost/mongo.js" gehe, werden die Ergebnisse beim ersten Mal einfach "[]" sein. Wenn ich auf "Aktualisieren" klicke, werden die Ergebnisse erwartet (ein JSON-Array mit Personen). Geht das nicht falsch?

Sagen wir jetzt mache ich es mit einer Abfrage, "http: //localhost/mongo.js? Name = Daniel", und bekomme alle Personen mit dem Namen Daniel. Die Antwort wird das erste Mal "alle Personen" sein, denn das ist, was wir oben gefragt haben, und wenn ich auffrische, werden die Ergebnisse alle Personen namens Daniel sein. Warum passiert das? Es scheint, dass der Server die Abfrage zwischengespeichert hat, die ich gemacht habe, und ich möchte nicht jedes Mal aktualisieren, um die korrekten Ergebnisse zu erhalten.

Dies ist mein Code ich verwende: (auch hier 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); 

Antwort

4

Sie müssen bedenken, dass Sie immer in einem Asynchron-Welt sind mit node.js. Das hat mich auch aus einem synchroneren Hintergrund erwischt.

Was hier passiert ist Ihre Antwort wird zurückgegeben, bevor die Logik ausgeführt wird. Dies ist der Fall, wenn Sie db.open(function() { aufrufen, geht dies in die Ereignisschleife und kehrt zurück. Dies ist nicht blockierend, daher ist die nächste Codezeile response.writeHead(200, {'Content-Type': 'application/json;charset=utf-8'});. Dann wird der Callback für db.open irgendwann in der Zukunft aufgerufen.

Um dies zu korrigieren. geben Sie die Antwort zurück, nachdem die cursor.each(function(err, doc) { Schleife beendet ist.

Hoffe, das hilft.