Bem, você pode definir o
bufferMaxEntries
opção ( documentada em Db
mas preterido para o uso desse objeto, use no "nível superior, conforme demonstrado" ) na conexão, que essencialmente interrompe as solicitações de "enfileiramento" no driver quando nenhuma conexão está realmente presente. Como um exemplo mínimo:
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;
Então, na verdade, estou aguardando a conexão do banco de dados para pelo menos estar presente na "inicialização" aqui, mas realmente apenas por exemplo, pois quero inserir alguns dados para realmente recuperar. Não é obrigatório, mas o conceito básico é esperar pela
Promise
resolver:await db.then(() => 1);
Meio trivial e não é realmente necessário para o seu código real. Mas ainda acho que é uma boa prática.
O teste real é feito parando
mongod
ou, de outra forma, tornar o servidor inacessível e, em seguida, emitir uma solicitação. Como definimos as opções de conexão para
{ bufferMaxEntries: 0 }
isso significa que imediatamente à medida que você tenta emitir um comando para o banco de dados, a falha será retornada se não houver uma conexão real presente. Claro que quando o banco de dados estiver disponível novamente, você não receberá o erro e as instruções acontecerão normalmente.
Sem a opção, o padrão é "enfileirar" as operações até que uma conexão seja resolvida e, em seguida, o "buffer" seja essencialmente "reproduzido".
Você pode simular isso (como eu fiz) "parando" o
mongod
daemon e emitindo requisições. Em seguida, "iniciando" o daemon e emitindo solicitações. Ele deve simplesmente retornar a resposta de erro capturada.