MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Mongo db с Monk:улавяне на грешки и обработка, ако db не работи

Всъщност можете да зададете bufferMaxEntries опция ( документирана под Db но отхвърлено за това използване на обект, използвайте на "най-високо ниво, както е показано вместо това" ) на връзката, което по същество спира "подреждането на опашка" на заявки на драйвера, когато връзката действително не е налице.

Като минимален пример:

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;

Така че всъщност чакам връзката с базата данни поне да присъства при „стартиране“ тук, но наистина само например, тъй като искам да вмъкна някои данни, които действително да извлека. Не е задължително, но основната концепция е да изчакате Promise за разрешаване:

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

Някак тривиално и всъщност не е необходимо за вашия действителен код. Но все още смятам, че това е добра практика.

Истинският тест се прави чрез спиране на mongod или по друг начин да направи сървъра недостъпен и след това да издаде заявка.

Тъй като задаваме опциите за свързване на { bufferMaxEntries: 0 } това означава, ченезабавно докато се опитвате да подадете команда към базата данни, грешката ще бъде върната, ако няма действителна връзка.

Разбира се, когато базата данни стане отново достъпна, няма да получите грешката и инструкциите ще се изпълняват нормално.

Без опцията по подразбиране операциите се поставят в "на опашка", докато връзката бъде разрешена и след това "буферът" по същество се "възпроизвежда".

Можете да симулирате това (както направих аз), като "спирате" mongod демон и издаване на заявки. След това "стартиране" на демона и издаване на заявки. Трябва просто да върне отговора за уловена грешка.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB - Пуснете колекция

  2. Грешка в именуването на колекция Mongoose?

  3. MongoDB sum() данни

  4. MongoDB:Намиране на зададени стойности на полета в документ с неизвестен ключ

  5. Изтрийте всичко в база данни на MongoDB