Du kan faktiskt ställa in bufferMaxEntries
alternativ ( dokumenterat under Db
men föråldrat för det objektet, använd på "översta nivå som visas istället") på anslutningen, vilket i princip stoppar "köa" förfrågningar på drivrutinen när ingen anslutning faktiskt finns.
Som ett minimalt exempel:
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å jag väntar faktiskt på att databasanslutningen åtminstone ska vara närvarande vid "start upp" här, men egentligen bara till exempel eftersom jag vill infoga lite data för att faktiskt hämta. Det är inte nödvändigt, men grundkonceptet är att vänta på Promise
att lösa:
await db.then(() => 1);
Lite trivialt och egentligen inte nödvändigt för din faktiska kod. Men jag tycker fortfarande att det är bra praxis.
Det riktiga testet görs genom att stoppa mongod
eller på annat sätt göra servern oåtkomlig och sedan utfärda en begäran.
Eftersom vi ställer in anslutningsalternativen till { bufferMaxEntries: 0 }
detta betyder att omedelbart När du försöker utfärda ett kommando till databasen kommer felet att returneras om det inte finns någon faktisk anslutning.
Naturligtvis när databasen blir tillgänglig igen kommer du inte att få felet och instruktionerna kommer att ske normalt.
Utan alternativet är standarden att "köa" operationerna tills en anslutning är löst och sedan "bufferten" "spelas upp".
Du kan simulera detta (som jag gjorde) genom att "stoppa" mongod
daemon och utfärdande av förfrågningar. Sedan "startar" demonen och skickar förfrågningar. Det bör helt enkelt returnera det fångade felsvaret.