sql >> データベース >  >> NoSQL >> MongoDB

Monkを使用したMongodb: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);
      }
    
    })();
    

    routers.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. meteorはmongodbにファイルをアップロードします

    2. このノードはreplSetオプションで開始されませんでした

    3. Mongodbの埋め込み構造の更新と検索?

    4. $whereの2つの異なるフィールドの論理ORmongodbのクエリ