2012-04-02 3 views
0

Я новичок в nodejs, но вчера я получил кое-что, чтобы работать с mongodb на сервере IIS с iisnode. :)nodejs & mongodb обновить ошибку?

Но я задаюсь вопросом об одной вещи, которая кажется обновленной ошибкой или чем-то еще. Когда я перехожу в «http: //localhost/mongo.js», в моем браузере результаты будут просто «[]» в первый раз. Если я удалю обновление, результаты будут такими, какие я ожидал (массив json с людьми). Dosen't это кажется неправильным?

Скажем, теперь я делаю это с запросом «http: //localhost/mongo.js? Name = 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) {.

Надеюсь, это поможет.

Смежные вопросы