Mongk:带有Monk的Mongo数据库:错误捕获和处理,如果数据库closures

我是Mongo的新手。 我需要一个简单的项目的数据库,并结束了使用Mongo和Monk的教程,但我有理解如何处理错误的问题。

背景 :我在客户端有registry单。 当用户点击一个button时,数据通过AJAX发送到控制器(经过validation,但现在不相关),将这些数据插入到数据库中,并返回成功或错误。 当数据库启动似乎一切正常。

问题 :如果我不启动数据库并尝试发送请求,则不会返回错误。 根本没有任何反应 经过一段时间在控制台上,我得到: POST / members / addmember – – ms – –

我认为在这种情况下应该返回给用户一些错误,那么我怎么能这样做呢?

post请求在下面(几乎和教程一样):

// app.js var db = monk('localhost:27017/dbname') [...] // I realize it might be not optimal here app.use(function(req,res,next){ req.db = db; next(); }); // members.js router.post('/addmember', function(req, res) { var db = req.db; var collection = db.get('memberstest'); collection.insert(req.body, function(err, result){ res.json( (err === null) ? { msg: 'success' } : { msg: err } ); }); }); 

如果数据库closures,我猜这个问题实际上甚至比插入更早,也就是在“ db.get() ”中。 那么如何检查是否可以实现呢? 我想假设节点的asynchronous特性就像try / catch一样,在这里是毫无意义的。 正确?

编辑:尼尔的答案和一些尝试后,我把以下似乎做的工作。 但是,鉴于我对此的信心不足,如果下面的代码是有意义的或偶然的,那么我将非常感激。 我添加了bufferMaxEntries:0选项并修改了控制器,如下所示。 在ajaxcallback中,我现在只是有一个警告,显示抛出的错误消息(如果有的话)。

 router.post('/addmember', async (req,res) => { try { let db = req.db; let collection = db.get('memberstest'); collection.insert(req.body, function(err, result){ res.json( (err === null) ? { msg: 'success' } : { msg: err } ); }); await db.then(() => 1); } catch(e) { res.json({msg: e.message}) } }); 

那么你可以在连接上实际设置bufferMaxEntries选项(在Db下logging,但不赞成用于该对象使用,在顶层使用),这基本上在连接实际上不存在时停止对驱动程序的“排队”请求。

作为一个最小的例子:

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; 

所以我实际上正在等待数据库连接,至less在这里“启动”,但实际上只是例如,因为我想插入一些数据来实际检索。 这不是必需的,但基本的概念是等待Promise解决:

 await db.then(() => 1); 

一些微不足道的,而不是真正需要你的实际代码。 但我仍然认为这是一个很好的做法。

真正的testing是通过停止mongod或以其他方式使服务器无法访问然后发出请求来完成的。

由于我们将连接选项设置为{ bufferMaxEntries: 0 }这意味着当您尝试向数据库发出命令时, 立即返回失败,如果没有实际的连接存在。

当然,当数据库再次可用时,您将不会得到错误,并且指示将正常发生。

如果没有这个选项,默认情况下就是对这些操作进行“排队”,直到连接被parsing,然后“缓冲区”基本上被“播放”。

你可以通过“停止” mongod守护进程和发出请求来模拟这个(就像我一样)。 然后“启动”守护进程并发出请求。 它应该简单地返回被捕获的错误响应。

注意 :不是必需的,但实际上, async/await语法的全部目的是使try..catch再次成为有效的东西,因为实际上可以将其作为块范围,而不是使用Promise.catch()errcallback参数来捕获错误。 当这些结构中的任何一个实际上被使用时,相同的原则适用。