2012-07-23 8 views
8

Estoy pasando por algunos escenarios de error, tratando de entender cómo manejarlos.Mongoose Model.find() se cuelga cuando no está conectado a la base de datos

En el caso donde no hay una conexión de base de datos, una llamada a Mongoose Model.find(...) parece colgarse. Debajo del código de ejemplo. Hubiera supuesto que la devolución de llamada se invoca con un objeto err, pero no lo es.

¿Cómo puedo evitar que cuelgue la llamada modelo? ¿Tengo que verificar manualmente el readyState cada vez que accedo a un modelo?

// app.js 
// Let's use a non-existing host so connecting fails: 
// (callback is invoked with err object) 
mongoose.connect('mongodb://localhostXXX/blog', function(err){ ... }); 

BlogPost = mongoose.model('BlogPost', BlogPostSchema); 

// api.js 
exports.list_posts = function(req, res) { 

    // Ready state is '0' = disconnected (since we used a wrong hostname) 
    console.log('DB ready state: ' + BlogPost.db.readyState); 

    // This will not invoke the callback: 
    BlogPost.find(function(err, threads) { 
     // Never called... 
    }); 
} 
+0

Muestra el código que implementa el método 'find' al que llamas' BlogPost'. – ebohlman

+0

@ebohlman 'BlogPost' es un modelo de mangosta (actualicé el código). – Mark

Respuesta

4

Puesto que ya está utilizando un controlador de errores en la llamada de conexión, lo más sensato sería que dejar su aplicación cuando el PP no se ha terminado, o activar algún middleware que responde con una bonita 500 Internal Server Error.

Mongoose usa node-mongodb-native debajo del capó para conexiones a mongodb, puede encontrar otras opciones de conexión útiles allí. :)

EDITAR: intente configurar socketOptions.socketTimeoutMS. Aparentemente no hay un conjunto de tiempo de espera predeterminado. Ver http://mongodb.github.com/node-mongodb-native/api-generated/server.html.

no tengo nodo en mi máquina de trabajo para probar la sintaxis exacta para usted, pero es probable que tenga que utilizar mongoose.Connection, que tiene un método que acepta open() opciones para pasar a través de node-mongodb-native. No creo que mongoose.connect() acepte estas opciones, pero podría estar equivocado.

+0

¿Qué pasa con el caso donde la base de datos se cae después de que el servidor ha sido iniciado? La conexión inicial tendrá éxito, pero ¿no llamaría más tarde al bloque 'find()' como describí anteriormente? – Mark

+0

he hecho un poco más de investigación, ver edición. pero tome esto con un grano de sal hasta que pueda probar su problema más adelante.:) – rdrey

+0

Según tengo entendido, mongo/mongoose está guardando el 'find' hasta que el db vuelva a conectarse. Creo que las opciones predeterminadas intentarán reconectarse automáticamente. En el ejemplo particular de OP, debe verificar que haya tenido una conexión inicial válida. – dule

7

No es una respuesta, pero espero que lo ayude a encontrar una solución. Tenía la cuestión muy similar con mongoose.createConnection durante el uso de módulo de pasaporte, descubrió que funciona bien con mongoose.connect

+2

Daría esto a +100 si pudiera. He estado tratando de resolver este problema por horas. –

+0

Muchas gracias por esto. No hubiera podido averiguarlo durante años. Esta respuesta explica la diferencia http://stackoverflow.com/questions/22786374/queries-hang-when-using-mongoose-createconnection-vs-mongoose-connect#answer-22838614. Y acabo de enviar un problema https://github.com/Automattic/mongoose/issues/4413 – cortopy

0

Con el fin de resolver este problema es necesario hacer 3 tareas:

  1. Configurar las bufferMaxEntries: 0 en la sección options.db (para más detalles ver here) Así que cuando bufferMaxEntries desactivar esta causa mangosta para detener comandos de amortiguación y de volver a intentar enviar cuando el servidor está abajo.

  2. Configure autoReconnect: false en la sección options.db deshabilite autoReconnet en el nivel db. (Ver más información here)

  3. si se está trabajando con mongodb replicaSet entonces usted necesita para desactivar bufferCommands en el nivel de esquema (por cada esquema se crea)

    esquema var = nuevo esquema ({..}, {bufferCommands: false});

Cuestiones relacionadas