Jak upewnić się, że Node.js nadal działa po spadku połączenia MonogDB?

W Expressie mam oprogramowanie pośrednie do obsługi błędów, które próbuje złapać wszystkie przychodzące błędy:

app.use(function(err, req, res, next){
  console.error(err.stack);
  res.status(500);
  res.render('500.jade');
});

Ale z jakiegoś powodu, kiedy zamykammongod proces, moja aplikacja ulega awarii z następującym śladem stosu:

Error: failed to connect to [localhost:27017]
    at null.<anonymous> (/<hidden>/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js:540:74)
    at EventEmitter.emit (events.js:106:17)
    at null.<anonymous> (/<hidden>/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:140:15)
    at EventEmitter.emit (events.js:98:17)
    at Socket.<anonymous> (/<hidden>/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js:478:10)
    at Socket.EventEmitter.emit (events.js:95:17)
    at net.js:441:14
    at process._tickCallback (node.js:415:13)

Process finished with exit code 8

Próbowałem użyć następującej konfiguracji, ale to mi nie pomogło:

var options = {
  server:{
    auto_reconnect: true,
      poolSize: 10,
      socketOptions:{
      keepAlive: 1
    }
  },
  db: {
    numberOfRetries: 10,
    retryMiliSeconds: 1000
  }
}

mongoose.connect(config.db, options);

Można się zastanawiać, dlaczego chcesz, aby aplikacja działała, jeśli w zasadzie nie działa bez połączenia z bazą danych? Nie chcę, aby się zawiesił i sam się zrestartował. Wydaje się, że moduły Supervisor i Forever przestają próbować ponownie połączyć się po pewnej liczbie prób, pozostawiając twoją aplikację w stanie zawieszenia.

Idealnie, gdy MongoDB zawiesza się, chciałbym wyświetlać użytkownikom stronę błędu 500.jade, tymczasem serwer powinien próbować ponownie łączyć się z bazą danych co 10 sekund. Po ponownym połączeniu wznów wszystkie normalne operacje.

EDYCJA: Żadne z zamieszczonych poniżej rozwiązań nie działało dla mnie, z wyjątkiem domen.

questionAnswers(3)

yourAnswerToTheQuestion