Nå, du kan faktisk indstille bufferMaxEntries
mulighed (dokumenteret under Db
men forældet for det pågældende objektbrug, brug på "topniveau som vist i stedet") på forbindelsen, hvilket i det væsentlige stopper "kø"-anmodninger på driveren, når der faktisk ikke er nogen forbindelse til stede.
Som et minimalt eksempel:
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;
Så jeg afventer faktisk databaseforbindelsen til i det mindste at være til stede ved "opstart" her, men egentlig kun for eksempel, da jeg vil indsætte nogle data for rent faktisk at hente. Det er ikke påkrævet, men det grundlæggende koncept er at vente på Promise
at løse:
await db.then(() => 1);
Slags trivielt, og ikke rigtig påkrævet for din faktiske kode. Men jeg synes stadig, det er god praksis.
Den rigtige test udføres ved at stoppe mongod
eller på anden måde gøre serveren utilgængelig og derefter udstede en anmodning.
Da vi indstiller forbindelsesmulighederne til { bufferMaxEntries: 0 }
det betyder, at med det samme Når du forsøger at udstede en kommando til databasen, vil fejlen blive returneret, hvis der ikke er nogen egentlig forbindelse til stede.
Når databasen bliver tilgængelig igen, får du selvfølgelig ikke fejlen, og instruktionerne vil ske normalt.
Uden muligheden er standarden at "en-kø" operationerne, indtil en forbindelse er løst, og derefter "bufferen" er i det væsentlige "afspillet".
Du kan simulere dette (som jeg gjorde) ved at "stoppe" mongod
dæmon og udstedelse af anmodninger. Derefter "starter" dæmonen og udsteder anmodninger. Det skulle blot returnere det fangede fejlsvar.