gpt4 book ai didi

javascript - Mongodb 与和尚 : error catching and handling if db is down

转载 作者:可可西里 更新时间:2023-11-01 09:48:14 26 4
gpt4 key购买 nike

我是 Mongo 的新手。我需要一个用于一个简单项目的数据库,并最终遵循了使用 Mongo 和 Monk 的教程,但我无法理解如何处理错误。

背景:我在客户端有一个注册表。当用户单击按钮时,数据通过 AJAX 发送到 Controller (经过验证,但现在不相关)将此类数据插入数据库并发回成功或错误。当数据库启动时,一切似乎都工作正常。

问题:如果我不启动数据库并尝试发送请求,则不会返回任何错误。什么也没有发生。在控制台上一段时间后,我得到:POST/members/addmember - - ms - -

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

帖子请求如下(与教程中的差不多):

// 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 }
);
});
});

如果数据库出现故障,我猜问题实际上比插入更早,即在“db.get()”中。那么如何检查 get 是否真的可以完成呢?我想鉴于 Node 的异步性质,像 try/catch 这样的东西在这里毫无意义。正确吗?

编辑:在 Neil 的回答和一些尝试之后,我将以下内容放在一起似乎可以完成这项工作。但是,鉴于我对此缺乏信心,如果下面的代码因为有意义或偶然而有效,我将不胜感激。我添加了 bufferMaxEntries: 0 选项并修改了 Controller 如下。在 ajax 回调中,我现在只是有一个警报,显示抛出的错误消息(如果有的话)。

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 下记录,但不推荐使用该对象,而是在“顶层作为演示”使用),这实际上停止了“排队” "当实际不存在连接时向驱动程序请求。

作为一个最小的例子:

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;

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

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

有点微不足道,对于您的实际代码来说并不是真正需要的。但我仍然认为这是很好的做法。

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

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

当然,当数据库再次可用时,您不会收到错误,指令会正常进行。

如果没有该选项,默认情况下是将操作“入队”,直到连接被解析,然后“缓冲区”基本上被“播放”。

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

NOTE: Not required, but in fact the whole purpose of async/await syntax is to make things like try..catch valid again, since you can actually scope as blocks rather than using Promise.catch() or err callback arguments to trap the errors. Same principles apply when either of those structures are actually in use though.

关于javascript - Mongodb 与和尚 : error catching and handling if db is down,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45580025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com