那么你实际上可以设置bufferMaxEntries
选项(记录在Db但不推荐使用该对象,而是在连接上使用“顶层,如演示的那样”),这实际上会在实际不存在连接时停止驱动程序上的“排队”请求。
作为一个最小的例子:
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);
}
})();
路线.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;
因此,我实际上正在等待数据库连接至少在“启动”时出现,但实际上只是例如,因为我想插入一些数据来实际检索。这不是必需的,但基本概念是等待Promise
解决:
await db.then(() => 1);
有点微不足道,并且对于您的实际代码来说并不是真正需要的。但我仍然认为这是一个很好的做法。
真正的测试是通过停止来完成的mongod
或者以其他方式使服务器无法访问,然后发出请求。
由于我们将连接选项设置为{ bufferMaxEntries: 0 }
这意味着立即地当您尝试向数据库发出命令时,如果不存在实际连接,则会返回失败。
当然,当数据库再次可用时,您不会收到错误,并且指令将正常发生。
如果没有该选项,默认情况下会将操作“入队”,直到解析连接,然后“缓冲区”实质上“播放”。
您可以通过“停止”来模拟这一点(就像我所做的那样)mongod
守护进程并发出请求。然后“启动”守护进程并发出请求。它应该简单地返回捕获的错误响应。
NOTE:不是必需的,但实际上是整个目的async/await
语法是让事情变得像try..catch
再次有效,因为您实际上可以将范围视为块而不是使用Promise.catch()
or err
用于捕获错误的回调参数。然而,当这些结构中的任何一个实际使用时,同样的原则适用。