2013-07-22 14 views
5

Mam aplikację z MongoDB jako backend. Po uruchomieniu aplikacji konfiguruję połączenie i używam go później w żądaniach.Jak sprawdzić, czy połączenie MongoDB jest żywe w Node.js

Ale jeśli w międzyczasie nie udaje mi się połączyć z db db (np. Mongody), jak mogę to sprawdzić w czasie żądania?

Aby wyjaśnić trochę:

  • obecnie mam "api.js", która robi db.once('open', function../* setup */)
  • na zamówienie, robię db.find(conditions, function(err, res) { if (err) ...else ...}).

Co chcę zrobić, to sprawdzić, czy połączenie jest żywe przed klauzulą ​​db.find(). Więc jeśli nie działa, mogę spróbować ponownie uruchomić połączenie db.

P.S. Wiem, prawdopodobnie powinienem ustawić jakąś pulę połączeń lub coś podobnego, zamiast utrzymywać połączenie przy życiu przez cały czas, ale teraz jest ustawione tak, jak jest.

+0

Ok, przy założeniu najszybszego sposobu na wykrycie- błąd w połączeniu stan byłby pierwszą próbą operacji i ponownej próby niepowodzenia (http://stackoverflow.com/questions/8936922/is-inserting-a-new-database -więcej-szybciej-niż-sprawdzanie-jeśli-wejście-istnieje-pierwsze) Jaki byłby najbardziej elegancki sposób na enkapsulację tej próby? – Montagist

Odpowiedz

5

Możesz użyć zdarzenia, aby obsłużyć je jako oddzwonienie.
I może mieć zmienną globalną, która wskaże, że nie jest połączona.

Możesz mieć oddzielny plik db.js, który będzie zachowywał się jak moduł. I możesz mieć funkcję pobierania z niej kolekcji.

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

więc z niego korzystać:

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

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

Niestety, właśnie zauważyliśmy używasz Mongoose, co może być nieco inna.

+1

To właśnie robię obecnie - robię, tj. users.find ({}, function (err, res) {if (err) .... else ...}) ;. Zastanawiam się, czy istnieje sposób na przetestowanie połączenia przed wysłaniem żądania, aby najpierw spróbować przywrócić połączenie. – Zlatko

+0

Zaktualizowałem odpowiedź, w tym bardziej niezawodne rozwiązanie. – moka

+0

Nie widzę, jak to w ogóle dotyczy pytania. Otrzymujesz błąd. Ten błąd mógł dotyczyć wielu rzeczy, a nie wszystkich związanych z połączeniem. – Montagist

Powiązane problemy