Jak uzyskać dostęp do MongoDB Count Wyniki w NodeJs, więc wynik może być dostępny do żądania asynchronicznego? Mogę uzyskać wynik i zaktualizować bazę danych, ale żądanie asynchroniczne nie może uzyskać dostępu do Vars lub Vars, a Vars wydaje się być aktualizowane po dokonaniu następnej żądania asynchronicznego. Wniosek nie może czekać na wykończenie zapytania, a następne żądanie jest wypełnione zmiennymi poprzednie żądania.

testOne.increment = function(request) {   
    var MongoClient = require('mongodb').MongoClient,
        format = require('util').format;
    MongoClient.connect('mongodb://127.0.0.1:27017/bbb_tracking', function(err, db) {
    if (err) throw err;
    collection = db.collection('bbb_tio');
        collection.count({vio_domain:dom}, function(err, docs) {
    if (err) throw err;                                     
    if (docs > 0) {
            var vio_val = 3;                                        
        } else {
            var vio_val = 0;                    
        }                   
        if (vio_val === 3) {
                event = "New_Event";
        var inf = 3;
            }                                       
        db.close();

        console.log("docs " + docs);
        });       
   });                    
};

W powyższym, nawet gdy Vars są ustawione w zakresie, w zasięgu nie są asynchronicznie. Czy mogę uzyskać prawidłowe wskazówki dotyczące strukturyzacji tego, aby Vars są wypełnione w wywołaniu zwrotnym. Dziękuję Ci!

2
user2948977 2 grudzień 2013, 00:50

3 odpowiedzi

Najlepsza odpowiedź

Ponieważ funkcja count jest asynchroniczna, musisz przekazać wywołanie zwrotne do funkcji increment, tak że gdy count zostanie zwrócona z bazy danych, kod może zadzwonić do wywołania zwrotnego.

testOne.increment = function(request, callback) {   
    var MongoClient = require('mongodb').MongoClient,
        format = require('util').format;
    MongoClient.connect('mongodb://127.0.0.1:27017/bbb_tracking', function(err, db) {
        if (err) throw err;
        var collection = db.collection('bbb_tio');
        // not sure where the dom value comes from ?
        collection.count({vio_domain:dom}, function(err, count) {
            var vio_val = 0;
            if (err) throw err;                                     
            if (count > 0) {
                vio_val = 3;                                        
                event = "New_Event";
                var inf = 3;
            }                                       
            db.close();

            console.log("docs count: " + count);        
           // call the callback here (err as the first parameter, and the value as the second)
           callback(null, count);   
        });       
   });                 
};

testOne.increment({}, function(err, count) {
   // the count would be here...
});

(nie rozumiem, jakie są zmienne, które używałeś lub dlaczego nie są używane później, więc po prostu zrobiłem trochę czyszczenia. Zmienne są zasłonione do bloków funkcyjnych i podnoszących do funkcji, Więc nie musisz ich ponosić ich w każdym, jeśli blok, jak zrobiłeś z vio_val).

2
WiredPrairie 1 grudzień 2013, 21:44

Możesz użyć modułu "Async". Sprawia, że kod jest bardzo czyszczeniem i łatwiejszym do debugowania. Spójrz na kod w Github dla Adduser.js i deleteuser.js w następującej postie

http://gigadom.wordpress.com/2014/11/05/bend-it-like-blueMix-mongodb-using-auto-scaling-part-2/

Pozdrawiam Ganesh.

0
Tinniam V. Ganesh 21 listopad 2014, 05:54

Długość daje liczbę tablicy wyników

  const userdata = await User.find({ role: role, 'name': new RegExp(searchkey, 'i')  },{date: 0,__v:0,password:0}).
      sort(orderObj)
      .limit(limit)
      .skip(skip);



      console.log(userdata.length);
0
manoj patel 29 maj 2020, 12:59