Vlastně můžete nastavit bufferMaxEntries
možnost ( zdokumentováno pod Db
ale zastaralé pro použití tohoto objektu, použijte na připojení na "nejvyšší úrovni, jak je ukázáno" ), což v podstatě zastaví "řadění" požadavků na ovladač, když ve skutečnosti není žádné připojení.
Jako minimální příklad:
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že vlastně čekám, že zde bude připojení k databázi alespoň přítomno při "spouštění", ale opravdu jen například proto, že chci vložit nějaká data, abych je skutečně načetl. Není to povinné, ale základním konceptem je počkat na Promise
vyřešit:
await db.then(() => 1);
Trochu triviální a pro váš skutečný kód to není opravdu nutné. Ale stále si myslím, že je to dobrá praxe.
Skutečný test se provádí zastavením mongod
nebo jiným způsobem učinit server nedostupným a poté odeslat požadavek.
Protože jsme nastavili možnosti připojení na { bufferMaxEntries: 0 }
to znamená, že okamžitě při pokusu o zadání příkazu do databáze se chyba vrátí, pokud není k dispozici žádné skutečné připojení.
Samozřejmě, když bude databáze znovu dostupná, chyba se nezobrazí a pokyny proběhnou normálně.
Bez této možnosti je výchozím nastavením „zařadit do fronty“ operace, dokud se nevyřeší připojení a poté se „vyrovnávací paměť“ v podstatě „přehraje“.
Můžete to simulovat (jako já) "zastavením" mongod
démon a vydávání požadavků. Poté "spuštění" démona a vydávání požadavků. Měl by jednoduše vrátit odpověď na zachycenou chybu.