gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:25:56 24 4
gpt4 key购买 nike

我是 Mongo 新手。我需要一个简单项目的数据库,最终遵循了使用 Mongo 和 Monk 的教程,但我在理解如何处理错误方面遇到了问题。

背景:我在客户端有一个注册表单。当用户单击按钮时,数据通过 AJAX 发送到 Controller (经过验证,但现在不相关),该 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 这样的东西在这里是毫无意义的。对吗?

编辑:在尼尔的回答和一些尝试之后,我整理了以下似乎可以完成这项工作的内容。然而,鉴于我对此缺乏信心,如果下面的代码有效,我将不胜感激,因为它有意义或偶然。我添加了 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 与 Monk : error catching and handling if db is down,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46309779/

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