MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Mongo db with Monk:wykrywanie i obsługa błędów, jeśli db nie działa

Cóż, właściwie możesz ustawić bufferMaxEntries opcja ( udokumentowana w Db ale przestarzałe dla tego użycia obiektu, użyj na „najwyższym poziomie, jak pokazano” ) w połączeniu, co zasadniczo zatrzymuje żądania „kolejkowania” w sterowniku, gdy w rzeczywistości nie ma połączenia.

Jako minimalny przykład:

index.js

const express = require('express'),
      morgan = require('morgan'),
      db = require('monk')('localhost/test',{ bufferMaxEntries: 0 }),
      app = express();

const routes = require('./routes');

app.use(morgan('combined'));

app.use((req,res,next) => {
  req.db = db;
  next();
});

app.use('/', routes);

(async function() {

  try {

    await db.then(() => 1);

    let collection = db.get('test');
    await collection.remove({});

    await collection.insert(Array(5).fill(1).map((e,i) => ({ a: i+1 })));
    console.log('inserted test data');

    await app.listen(3000,'0.0.0.0');
    console.log('App waiting');

  } catch(e) {
    console.error(e);
  }

})();

routes.js

var router = require('express').Router();

router.get('/', async (req,res) => {
  try {
    let db = req.db,
        collection = db.get('test');

    let response = await collection.find();
    res.json(response);
  } catch(e) {
    res.status(500).json(e);
  }
});

module.exports = router;

Tak więc faktycznie czekam na połączenie z bazą danych, aby przynajmniej było obecne przy "uruchamianiu" tutaj, ale tak naprawdę tylko na przykład, ponieważ chcę wstawić jakieś dane do faktycznego pobrania. Nie jest to wymagane, ale podstawową koncepcją jest oczekiwanie na Promise rozwiązać:

await db.then(() => 1);

Trochę trywialne i nie jest tak naprawdę wymagane dla twojego rzeczywistego kodu. Ale nadal uważam, że to dobra praktyka.

Prawdziwy test jest wykonywany przez zatrzymanie mongod lub w inny sposób czyniąc serwer nieosiągalnym, a następnie wysyłając żądanie.

Ponieważ ustawiliśmy opcje połączenia na { bufferMaxEntries: 0 } oznacza to, że natychmiast gdy próbujesz wydać polecenie do bazy danych, niepowodzenie zostanie zwrócone, jeśli nie ma rzeczywistego połączenia.

Oczywiście, gdy baza danych stanie się ponownie dostępna, błąd nie pojawi się, a instrukcje będą działać normalnie.

Bez tej opcji domyślnie "w kolejce" operacje do momentu rozwiązania połączenia, a następnie "bufor" jest zasadniczo "odtwarzany".

Możesz to zasymulować (tak jak ja), „zatrzymując” mongod demon i wydawanie żądań. Następnie "uruchom" demona i wyślij żądania. Powinien po prostu zwrócić odpowiedź na przechwycony błąd.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak zapewnić paginację po stronie serwera za pomocą NestJS?

  2. Nie można poprawnie zainstalować mongodb na Ubuntu 18.04 LTS

  3. Rama agregacji mongodb pasuje do zagnieżdżonych dokumentów

  4. Jak połączyć mongoDB z Pythonem?

  5. Jak poprawić wydajność update() i save() w MongoDB?