2013-03-22 16 views
5

Mam prosty kod próbujący znaleźć dokument w kolekcji MongoDB. Mogę go znaleźć normalnie z klientem powłoki Mongo, ale dzięki Node jest niemożliwe, próbowałem na wiele sposobów bezskutecznie.Węzeł - MongoDB: kolekcja nie znajduje niczego, używając sterownika mongodb. Shell zwraca wartość:

Pierwsze moje wyniki od samego MongoDB:

[email protected]:~$ mongo sdk_back 
MongoDB shell version: 2.0.6 
connecting to: sdk_back 
> db.metadatos.find(); 
{ "_id" : ObjectId("514cbee35c10db0299c015c7"), "tipo" : "proceso" } 
> db.metadatos.findOne({"tipo":"proceso"}); 
{ "_id" : ObjectId("514cbee35c10db0299c015c7"), "tipo" : "proceso" } 
> db.metadatos.findOne({tipo:"proceso"}); 
{ "_id" : ObjectId("514cbee35c10db0299c015c7"), "tipo" : "proceso" } 
> 

Jak widać, zarówno znaleźć i findOne odpytuje prace. Teraz to jest mój kod Węzeł:

var utils = require('../utils/utils.js'), 
    Server = require('mongodb').Server, 
    Db = require('mongodb').Db; 

    exports.procesaJSON = function (input_json){ 
    if(!utils.validaJSON(input_json)) 
     throw new Error('JSON de entrada inválido!'); 

    //procesamos 
    input_json = JSON.parse(input_json); 

    if(typeof(input_json.id) === "undefined") 
     throw new Error('JSON de entrada inválido (falta propiedad \"id\"!'); 

    //obtenemos meta-data de mongo 
    var db = new Db("sdk_back", new Server('localhost',27017,{auto_reconnect:true, poolsize:1}),{safe:true}); 
    db.open(function(err,db){ 
     if(!err){ 
      db.collection("metadatos",function(err,collection){ 
       console.log('Entering collection meta-data'); 
       if(!err){ 
        console.log('Lets find one'); 
        collection.findOne({"tipo":"proceso"},function(err,doc){ 
         console.log('Results of findOne'); 
         if(!err){ 
          console.log(doc); 
         } 
         else{ 
          throw new Error('Error al buscar meta_data!'); 
         } 

         if(doc){ 
          console.log('We have results'); 
         } 
         else{ 
          console.log('We dont have results'); 
         } 
        }); 
       } 
       else{ 
        throw new Error('Error al buscar meta_data 1!'); 
       } 
      }); 
     } 
     else{ 
      throw new Error('Error al conectarse a MongoDB!'); 
     } 
     db.close(); 
    }); 
}; 

a wyjście jest zawsze:

[email protected]:~$ node pu_entrypoint.js 
Entering collection meta-data 
Lets find one 
[email protected]:~$ 

Jak widać, dziennik z tekstem „Wyniki findOne” nigdy nie jest wyświetlany, więc metoda findOne właściwie nigdy nie zostanie wykonany, czy coś w tym stylu.

Moje pytanie brzmi: co robię źle? Upuściłem i odtworzyłem kolekcję, usunąłem bazę danych, a nawet zmieniłem katalog/data/db dla Mongo, bezskutecznie.

Co robię źle?

Dziękujemy!

[SOLVED] AKTUALIZACJA: Problem dotyczył db.close(). Węzeł beign asynchroniczny, osiągnął koniec bazy danych przed znalezieniem kolekcji, więc oczywiście nie mógł nic znaleźć. Po prostu przenoszenie db.close w moim ostatnim oddzwonieniu, rozwiązałem problem. Oto edytowany kod:

db.open(function(err,db){ 
      if(!err){ 
       db.collection("metadatos",function(err,collection){ 
        console.log('Entering collection meta-data'); 
        if(!err){ 
         console.log('Lets find one'); 
         collection.findOne({"tipo":"proceso"},function(err,doc){ 
          console.log('Results of findOne'); 
          if(!err){ 
           if(doc){ 
            console.log('We have results'); 
            console.log(doc._id); 
           } 
           else{ 
            console.log('We dont have results'); 
           } 
/********** MOVED db.close() HERE ********************/ 
           db.close(); 
          } 
          else{ 
           throw new Error('Error al buscar meta_data!'); 
          } 
         }); 
        } 
        else{ 
         throw new Error('Error al buscar meta_data 1!'); 
        } 
       }); 
      } 
      else{ 
       throw new Error('Error al conectarse a MongoDB!'); 
      } 
/********** REMOVED db.close() FROM HERE ********************/ 
     }); 
+6

Btw, jeśli znajdziesz odpowiedzi na swoje pytanie, a nawet jeśli wiedział, to przed wysłaniem na pytanie, można opublikować go jako odpowiedź, a nie jako edit. http://meta.stackexchange.com/a/17467/ –

Odpowiedz

0

Problem dotyczy db.close(). Węzeł zaczyna się asynchronicznie i osiągnął koniec bazy danych zanim dotarł do znalezienia kolekcji, więc oczywiście nie mógł nic znaleźć. Przeniesienie db.close w ostatnim wywołaniu zwrotnym rozwiązuje problem. Oto edytowany kod:

db.open(function(err,db){ 
     if(!err){ 
      db.collection("metadatos",function(err,collection){ 
       console.log('Entering collection meta-data'); 
       if(!err){ 
        console.log('Lets find one'); 
        collection.findOne({"tipo":"proceso"},function(err,doc){ 
         console.log('Results of findOne'); 
         if(!err){ 
          if(doc){ 
           console.log('We have results'); 
           console.log(doc._id); 
          } 
          else{ 
           console.log('We dont have results'); 
          } 
/********** MOVE db.close() HERE ********************/ 
          db.close(); 
         } 
         else{ 
          throw new Error('Error al buscar meta_data!'); 
         } 
        }); 
       } 
       else{ 
        throw new Error('Error al buscar meta_data 1!'); 
       } 
      }); 
     } 
     else{ 
      throw new Error('Error al conectarse a MongoDB!'); 
     } 
/********** REMOVED db.close() FROM HERE ********************/ 
    }); 
Powiązane problemy