Обратный вызов при операции MongoDB с Node.js - PullRequest
2 голосов
/ 16 марта 2012

В целях организации я делю свой исходный код на модули, например, в моем приложении node.js есть модуль user, который отвечает за получение информации о пользователе из базы данных MongoDB. Я делаю что-то вроде этого:

var mongo = require("mongodb"),
    Server = mongo.Server,
    Db = mongo.Db;

var server = new Server("localhost", 27017, { auto_reconnect: true });
var db = new Db("users", server);

module.exports = {
    login: function(user, pass, callback) {
        var reg_result = null;

        db.open(function (err, db) {
            if(!err) {
                db.collection("users", function(err, collection) {
                    collection.findOne(
                        {
                            "username": user,
                            "password": pass
                        },
                        function(err, item) {
                            if(!err) {
                                reg_result = item;
                            } else {
                                reg_result = "error";
                            }
                        }
                    );
                });
            } else {
                reg_result = "error";
                console.log("ERROR: " + err);
            }
        });

        callback(reg_result);
    }
}

И выполнить его на моем тестовом скрипте так:

var user = require("./user.js");

user.log("test", "test", function(msg) {
    console.log(msg);
});

Он выполняет операцию с базой данных и получает значение, но каждый раз, когда он возвращает только null, когда я не инициализирую переменную reg_result, он возвращает undefined. Что я должен сделать, чтобы исправить это?

Я отладил с помощью console.log на user.js, и был выведен item, но я хочу получить обратный вызов, чтобы я мог использовать элемент в других источниках, например, мой тестовый скрипт

1 Ответ

5 голосов
/ 16 марта 2012

Вы вызываете функцию обратного вызова сразу, но обращение к БД занимает время и, следовательно, выполняется асинхронно.Вместо этого вызовите свой обратный вызов в соответствующее время, используя аргумент результата функции, переданный в качестве последнего параметра функции .findOne().Обратный вызов должен получить аргумент ошибки и результирующий аргумент:

login: function(user, pass, callback) {
    db.open(function (err, db) {
        if(!err) {
            db.collection("users", function(err, collection) {
                collection.findOne(
                    {
                        "username": user,
                        "password": pass
                    },
                    function(err, item) {
                        if(!err) {
                            callback(null,item);
                        } else {
                            callback("error");
                        }
                    }
                );
            });
        } else {
            callback("error",null);
        }
    });
}


user.login("test", "test", function(err,msg) {
    if( err ) {
      //error occured above;
    } else {
      //success
      console.log(msg);
    }
});

это всего лишь та же самая схема, которую использует драйвер mongodb.надеюсь, это поможет.

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