Ошибка обновления nodejs & mongodb? - PullRequest
0 голосов
/ 02 апреля 2012

Я новичок в nodejs, но вчера вечером мне удалось кое-что поработать с mongodb на IIS-сервере с iisnode.:)

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

Допустим, теперь я делаю это с помощью запроса "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); 

1 Ответ

4 голосов
/ 02 апреля 2012

Вы должны помнить, что вы всегда находитесь в асинхронном мире с node.js. Это также меня поразило, если исходить из более синхронизированного фона.

То, что происходит здесь, это ваш ответ возвращается до запуска логики. Это потому, что когда вы вызываете db.open(function() {, это переходит в цикл обработки событий и возвращается. Это не блокировка, поэтому следующая строка кода, которая выполняется: response.writeHead(200, {'Content-Type': 'application/json;charset=utf-8'});. Затем вызывается обратный вызов для db.open, когда-нибудь в будущем.

Чтобы исправить это. вернуть ответ после завершения цикла cursor.each(function(err, doc) {.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...