2012-07-23 11 views
8

Sto passando alcuni scenari di errore, cercando di capire come gestirli.Mongoose Model.find() si blocca quando non è connesso al database

Nel caso in cui non vi sia alcuna connessione al database, una chiamata di Mongoose Model.find(...) sembra bloccarsi. Sotto il codice di esempio. Avrei assunto che la richiamata sia invocata con un oggetto err, ma non lo è.

Come si può impedire il blocco della chiamata del modello? Devo controllare manualmente il readyState ogni volta che accedo a un modello?

// 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

Mostra il codice che implementa il metodo 'find' su cui si sta chiamando' BlogPost'. – ebohlman

+0

@ebohlman 'BlogPost' è un modello di mangusta (ho aggiornato il codice). – Mark

risposta

4

Dal momento che si sta già utilizzando un gestore di errori nella chiamata di connessione, una cosa sensata sarebbe quella di lasciare la vostra applicazione quando il DB non è all'altezza, o attivare alcune middleware che risponde con una bella 500 Internal Server Error.

Mongoose utilizza node-mongodb-native sotto il cofano per le connessioni a MongoDB, si potrebbe trovare altre utili opzioni di connessione in là. :)

MODIFICA: provare a impostare socketOptions.socketTimeoutMS. Apparentemente non esiste un set di timeout predefinito. Vedi http://mongodb.github.com/node-mongodb-native/api-generated/server.html.

non ho nodo sulla mia macchina di lavoro per provare la sintassi esatta per voi, ma probabilmente si dovrà usare mongoose.Connection, che ha un metodo open() che accetta le opzioni di passare attraverso node-mongodb-native. Non credo che mongoose.connect() accetti queste opzioni, ma potrei sbagliarmi.

+0

E il caso in cui il database va giù dopo che il server è stato avviato? La connessione iniziale avrà successo, ma in seguito non chiamerà il blocco 'find()' come descritto sopra? – Mark

+0

ho fatto un po 'più di ricerca, vedi modifica. ma prendi questo con un pizzico di sale fino a quando non posso testare il tuo problema più tardi.:) – rdrey

+0

A quanto ho capito, mongo/mongoose esegue il buffering del 'find' finché il db non si ricollega. Credo che le opzioni predefinite tenteranno di riconnettersi automaticamente. Nell'esempio OP particolare, si desidera verificare se si dispone di una connessione iniziale valida. – dule

7

Non è una risposta, ma spero che ti aiuti a trovare una soluzione. Ebbe figli molto simile con mongoose.createConnection durante l'utilizzo del modulo di passaporto, ha scoperto che funziona bene con mongoose.connect

+2

Darei un +100 se potessi. Ho cercato di risolvere questo problema per ore. –

+0

Grazie mille per questo. Non sarei stato in grado di capire per anni. Queste risposte spiegano la differenza http://stackoverflow.com/questions/22786374/queries-hang-when-using-mongoose-createconnection-vs-mongoose-connect#answer-22838614. E ho appena inviato un problema https://github.com/Automattic/mongoose/issues/4413 – cortopy

0

Per risolvere questo problema è necessario fare 3 compiti:

  1. Configurare le bufferMaxEntries: 0 nella sezione options.db (per maggiori dettagli vedere here) Così quando bufferMaxEntries disabilitare questo provoca mangusta per fermare i comandi del buffer e riprovare per inviargli il presente quando il server è giù.

  2. Configurare l'Autoreconnect: false nella sezione options.db autoReconnet disattivare nel livello db. (Vedi ulteriori informazioni here)

  3. se si sta lavorando con MongoDB replicaset allora è necessario disabilitare bufferCommands a livello di schema (per ogni schema si crea)

    var schema = new Schema ({..}, {bufferCommands: false});

Problemi correlati