2013-07-22 36 views
5

Ho un'app con MongoDB come backend. Quando l'app è avviata, imposto la connessione e la utilizzo in seguito alle richieste.Come verificare se la connessione MongoDB è attiva in Node.js

Ma se nel frattempo la mia db conncetion fallisce (ad esempio crash di mongod), come posso verificarlo al momento della richiesta?

Per chiarire un po ':

  • Attualmente ho un "api.js", che fa db.once('open', function../* setup */)
  • su richiesta, lo faccio db.find(conditions, function(err, res) { if (err) ...else ...}).

Quello che voglio fare è controllare se la connessione è attiva prima della clausola db.find(). Quindi, se non funziona, posso provare a riavviare la connessione db.

P.S. Lo so, probabilmente dovrei impostare una sorta di pool di connessioni o simili invece di mantenere la connessione sempre attiva, ma al momento è impostata così com'è.

+0

Ok, assumendo il modo più veloce per rilevare un errore nello stato di connessione, sarebbe innanzitutto il tentativo di operazione e riprovare l'errore (http://stackoverflow.com/questions/8936922/is-inserting-a-new-database -entry-faster-than-checking-if-the-entry-exists-first) quale sarebbe il modo più elegante per incapsulare quel tentativo, credi? – Montagist

risposta

5

È possibile utilizzare l'evento per gestirlo come richiamata.
E forse la tua variabile globale che identificherà che non è connessa.

È possibile avere separato il file db.js, che si comporterà come modulo. E puoi avere una funzione per ottenere la raccolta da esso.

var mongodb = require('mongodb'); 
var client; 
var collections = { }; 

new mongodb.Db(...).open((function (err, c) { 
    if (!err) { 
    client = c; 
    client.on('close', function() { 
     client = null; // clear client 
     collections = { }; // clear old collections 
     // connection closed 
    }); 
    } else { 
    // error connecting 
    } 
}); 

// get collection 
exports.get = function(name, callback) { 
    if (client) { 
    if (!collections[name]) { 
     collections[name] = new mongodb.Collection(client, name); 
    } 
    callback(null, collections[name]); 
    } else { 
    // can perform reconnecting and then get collection and call callback 
    callback(new Error('not connected')); 
    } 
} 

Quindi, per utilizzarlo:

var db = require('./db.js'); 

db.get('users', function(err, collection) { 
    if (!err) { 
    collection.find({ ... 
    } else { 
    console.log(err); 
    } 
}); 

Siamo spiacenti, appena notato che si sta utilizzando Mangusta, che può essere diverso un po '.

+1

Questo è quello che faccio attualmente - lo faccio, cioè. users.find ({}, function (err, res) {if (err) .... else ...}) ;. Mi chiedo se c'è un modo per testare la connessione prima di inviare una richiesta in modo che prima io tenti di ripristinare la connessione. – Zlatko

+0

Ho aggiornato la risposta, inclusa una soluzione più affidabile. – moka

+0

Non vedo come questo risolva la domanda. Hai un errore. L'errore potrebbe essere stato per un certo numero di cose, non tutte riguardanti la connessione. – Montagist

Problemi correlati