Zwracanie danych z callback

0

Witam,

W wolnym czasie piszę sobie pewne API. Podpinam właśnie pod nie MongoDb. Mam już gotowe metody z zapytaniami, ale mam problem z przekazywaniem danych z callback 'wyżej'. Kod jest następujący:


showUsers: function(db, object, callback){
        var cursor = db.collection('users').find(object);
        var data = [];
        cursor.each(function(err, doc) {
            assert.equal(err, null);
            if (doc != null) {
                data.push(doc);
            } else {
                callback(data);
            }
        });
    },

    dispatcher: function(callback, object){
        var result = mongoc.connect(DBHOST, function(err, db) {
            assert.equal(null, err);
            console.log("Connected correctly to mongodb server");
            var users = module.exports[callback](db, object, function(data){
                db.close();
                return data;
            });

            console.log(users);
        });
    }

W metodzie dispatcher() łączę się z mongo, po czym wywołuję metodę z odpowiednim query do bazy. Tam gdzie module.exports[callback]() w callback mogę bez problemu logować 'data', jednak gdy przypisuje całość do 'users' to późniejsze console.log(users); zwraca 'undefined'. Na początku sądziłem, że to niewielkie opóźnienie w dostarczaniu danych przez mongo, ale owrapowanie console.log(users) w setTimeout również nie pomaga. Ma ktoś jakieś sugestie jak rozwiązać problem ?

0

Moglbys powiedziec co chcesz osiagnac przez ten kod:


var users = module.exports[callback](db, object, function(data){
                db.close();
                return data;
            });

Mam kilka pomyslow co ma ten kod robic, ale lepiej jak Ty to wytlumaczysz. Callback to jest funkcja? (prawdopodobie tak, ale pytam) Dlaczego w tym momencie uzywasz module.export?

Operacja laczenia z mongo jest asynchroniczna, poczytaj o tym w kontekscie JS, wtedy na pewno zrozumiesz dlaczego return to zly pomysl.

0

A nie prościej zrobić to w ten sposób:

const showUsers = (db, queryObject) => db
    .collection('users')
    .find(queryObject)
    .toArray();

Jako wynik dostajesz promisa, w zależności z jakiego frameworka korzystasz możesz go obsłużyć następująco (tu go po prostu przekazuje jako JSON do klienta):

  • Express:

    showUsers(db, queryObject)
    .then(val => res.send(val));
  • Koa:

    this.body = yield showUsers(db, queryObject);

Callbacków należy unikać.

PS
Ten queryObject czy też object, jak to u siebie nazwałeś, jest trochę bez sensu - sugeruje, że można wykonać dowolnego "selecta" na userach, a nazwa funkcji tego nie obrazuje - albo wstaw zapytanie na sztywno albo zmień nazwę funkcji na bardziej adekwatną.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0