Cóż, właściwie możesz ustawić bufferMaxEntries
opcja ( udokumentowana w Db
ale przestarzałe dla tego użycia obiektu, użyj na „najwyższym poziomie, jak pokazano” ) w połączeniu, co zasadniczo zatrzymuje żądania „kolejkowania” w sterowniku, gdy w rzeczywistości nie ma połączenia.
Jako minimalny przykład:
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 więc faktycznie czekam na połączenie z bazą danych, aby przynajmniej było obecne przy "uruchamianiu" tutaj, ale tak naprawdę tylko na przykład, ponieważ chcę wstawić jakieś dane do faktycznego pobrania. Nie jest to wymagane, ale podstawową koncepcją jest oczekiwanie na Promise
rozwiązać:
await db.then(() => 1);
Trochę trywialne i nie jest tak naprawdę wymagane dla twojego rzeczywistego kodu. Ale nadal uważam, że to dobra praktyka.
Prawdziwy test jest wykonywany przez zatrzymanie mongod
lub w inny sposób czyniąc serwer nieosiągalnym, a następnie wysyłając żądanie.
Ponieważ ustawiliśmy opcje połączenia na { bufferMaxEntries: 0 }
oznacza to, że natychmiast gdy próbujesz wydać polecenie do bazy danych, niepowodzenie zostanie zwrócone, jeśli nie ma rzeczywistego połączenia.
Oczywiście, gdy baza danych stanie się ponownie dostępna, błąd nie pojawi się, a instrukcje będą działać normalnie.
Bez tej opcji domyślnie "w kolejce" operacje do momentu rozwiązania połączenia, a następnie "bufor" jest zasadniczo "odtwarzany".
Możesz to zasymulować (tak jak ja), „zatrzymując” mongod
demon i wydawanie żądań. Następnie "uruchom" demona i wyślij żądania. Powinien po prostu zwrócić odpowiedź na przechwycony błąd.