2012-07-27 24 views
11

Estaba jugando con mongodb e ingresé algunos datos de prueba {name: "david"} en la colección de 'usuarios'. I verificado que los datos estaba en MongoDB utilizando la consola mongo escribiendonode.js Consulta de MongoDB que no devuelve resultados

db.users.find() 

resultado:

{ "name":"david" } 

En el guión node.js, el siguiente código:

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(); 
}); 

no vuelve cualquier resultado

No veo nada mal y no se devuelve el error. Aconseje

Respuesta

9

En realidad estás cerrando la conexión de base de datos antes ha vuelto datos de la colección.

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

Este patrón funciona bien en mi muestra de nodo/mongo. La función pasa una devolución de llamada que toma err, colección. Obtiene la colección de 'usuarios' y si tiene éxito, las llamadas se encuentran en la colección y la convierten en una matriz, pero también puede iterar en el cursor.

Dentro del db.collection y de las llamadas de connection.find, no está comprobando que se haya producido un error. Solo lo estás haciendo en la llamada abierta.

Además, no debe llamar a db.close() especialmente si está abriendo con connection pool option (no desea abrir y cerrar la conexión en cada llamada). Si desea cerrar, luego cierre dentro de la devolución de llamada.

Algo así como:

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); 
        } 
       }); 
      } 
     } 
    }}); 

Aquí hay otro tutorial en el nodo + mongo que puede ayudar: http://howtonode.org/express-mongodb

4

Como afirma correctamente CJohn, está cerrando la conexión DB ANTES de recuperar los datos. Sé que no parece, pero este es el caso con la estructura y las devoluciones de llamadas del nodo. El código para manejar correctamente esto es:

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

Trate de actualizar el nodo a la última versión.

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

versión 0.4 puede que no funcionen correctamente.

Cuestiones relacionadas