2012-07-27 16 views
11

Ero in giro con mongodb e ho inserito alcuni dati di test {name: "david"} nella raccolta "utenti". Ho verificato che i dati sono stati in MongoDB usando la shell mongo digitandonode.js La query MongoDB non ha restituito i risultati

db.users.find() 

risultato:

{ "name":"david" } 

Nella sceneggiatura node.js, il seguente codice:

db.open(function(err, db) { 
    if (!err) { 
     console.log("db opened!"); 
    } 
    else { 
     console.log(err); 
    } 
    db.collection('users', function(err, collection) { 
     collection.find({}, function(err, cursor) { 
      cursor.each(function(err, item) { 
       console.log(item); 
      }); 
     }); 
    }); 
    db.close(); 
}); 

non restituisce qualsiasi risultato

Non vedo niente di sbagliato, e non restituisce err. Si prega di avvisare

risposta

9

Si sta effettivamente di chiudere la connessione al database prima che i dati della collezione è tornato.

db.collection('users', function(err, collection) { 
    collection.find({}, function(err, cursor) { 
    cursor.each(function(err, item) { 
     console.log(item); 
    }); 

    // our collection has returned, now we can close the database 
    db.close(); 
    }); 
}); 
2

Questo schema funziona correttamente nel mio esempio nodo/mongo. Alla funzione viene passata una richiamata che richiede errata raccolta. Ottiene la raccolta "utenti" e, in caso di esito positivo, le chiamate trovano contro la raccolta e la converte in una matrice, ma puoi anche scorrere il cursore.

All'interno delle chiamate db.collection e connection.find, non si sta verificando l'errore e la gestione. Lo stai facendo solo sulla chiamata aperta.

Inoltre, non si dovrebbe chiamare db.close() soprattutto se si apre con connection pool option (non si desidera aprire e chiudere la connessione ad ogni chiamata). Se volevi chiudere, chiudi la callback.

Qualcosa di simile:

var server = new Server(host, port, {auto_reconnect: true, poolSize: 5}, {}); 

MyStore.prototype.getUsers = function(callback) { 
server.open(function(err, db) { 
    if (err) { 
     callback(err); 
    } 
    else { 
     db.collection('users', function(err, collection) { 
      if(err) 
       callback(err); 
      else { 
       collection.find().toArray(function(err, users) { 
        if (err) { 
         callback(err) 
        } else { 
         callback(null, users); 
        } 
       }); 
      } 
     } 
    }}); 

Ecco un altro tutorial su nodo + Mongo che può aiutare: http://howtonode.org/express-mongodb

4

Come CJohn indica correttamente, si sta chiudendo la connessione DB PRIMA di recuperare i dati. So che non sembra, ma è il caso della struttura del nodo e dei callback. Il codice per gestire correttamente questo è:

db.open(function(err, db) { 
    if (err) return console.log('error opening db, err = ', err); 

    console.log("db opened!"); 

    db.collection('users', function(err, collection) { 
     if (err) return console.log('error opening users collection, err = ', err); 

     collection.find({}, function(err, cursor) { 
      if (err) return console.log('error initiating find on users, err = ', err); 

      cursor.each(function(err, item) { 
       // watch for both errors and the end of the data 
       if (err || ! item) { 
        // display (or do something more interesting) with the error 
        if (err) console.log('error walking data, err = ', err); 

        // close the connection when done OR on error 
        db.close(); 

        return; 
       } 
       console.log(item); 
      }); 
     }); 
    }); 
}); 
3

provare ad aggiornare il nodo alla versione più recente.

sudo npm cache clean -f 
sudo npm install -g n 
sudo n stable 

versione 0.4 potrebbe non funzionare correttamente.

Problemi correlati