Mongodb 与 Monk:如果数据库关闭,错误捕获和处理

2023-11-29

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

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

问题:如果我不启动数据库并尝试发送请求,则不会返回错误。根本什么也没发生。在控制台上运行一段时间后,我得到: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实际上可以做到吗?我认为考虑到节点的异步性质,像 try/catch 这样的东西在这里是毫无意义的。正确的?

编辑:在尼尔的回答和一些尝试之后,我整理了以下似乎可以完成这项工作的内容。然而,鉴于我对此缺乏信心,如果下面的代码有效,我将不胜感激,因为它有意义或偶然。我添加了 bufferMaxEntries: 0 选项并修改了控制器,如下所示。在 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);
  }

})();

路线.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用于捕获错误的回调参数。然而,当这些结构中的任何一个实际使用时,同样的原则适用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mongodb 与 Monk:如果数据库关闭,错误捕获和处理 的相关文章

随机推荐

  • 使用 PHP 删除缩写日期中的前导零

    我想知道是否有办法使用 PHP 将此日期格式 01 08 86 1986 年 1 月 8 日 更改为此格式 1 8 86
  • 使用谷歌地图API计算两点之间的距离?

    是否可以将两个纬度长点发送给谷歌来计算两者之间的距离 如果您想使用 v3 谷歌地图 API 这里是我使用的函数 注意 必须添加 libraries geometry到你的脚本源 现在的功能 calculates distance betwe
  • dplyr 总结输出 - 如何保存它

    我需要计算 150 个物种中每种鸟类繁殖活动观察结果的汇总统计数据 数据框包含物种 scodef 观察类型 codef 例如筑巢 和序号日期 自 1 月 1 日起的天数 自多年来收集数据以来 使用 dplyr 我得到了我想要的结果 libr
  • 检测 R 会话是否在启动时在 RStudio 中运行 [重复]

    这个问题在这里已经有答案了 我在终端和 RStudio 在 mac 和 linux 上 中都使用 R 想知道是否可以使用不同的 Rprofiles 为两者 或者最好使用相同的碱基 Rprofile但来源不同环境特定的调整脚本 我认为将以下代
  • Mongoid:使用多个数据库?

    我在 Rails 应用程序中使用 MongoDB 和 MongoID 某些模型如何成为同一服务器上不同 mongo 数据库的一部分 我该如何完成这样的事情呢 我之前在mysql上也遇到过同样的问题 但找不到合理的解决方案 有什么想法吗 最新
  • 包装 div 不会随内容 div 一起扩展

    我已经尝试了大约 15 种不同的教程和技巧来让我的页脚 页眉和三个内容 div 正常工作 我的页面将有一个页眉 左侧的导航栏 中间的内容 右侧的商店和 Google 广告以及下方的页脚 现在 在尝试了一些教程之后 我终于让页脚留在包装器下方
  • 我如何使用 Swift 向网站请求文本?

    因此 我正在制作一个 iOS 应用程序 并且制作了一个警报栏 该警报栏会在每次打开应用程序时根据网站上的文本进行更新 但是当我发出 HTTP 请求时 它只提供该网站的 HTML 如何从网页获取文本而不是 HTML 我正在使用下面的 Swif
  • 字体真棒快捷方式

    我在我的网络项目中使用 Awesome Font 是否有任何选项如何创建一堆图标的快捷方式 例如 我有circle thin图标 现在在页面上我想将三个图标放在一起 所以结果是OOO 但我不想放 3x 次 i class fa fa cir
  • opencv - 图像乘法

    嗨 我正在尝试玩一点 Mat 课 我想在两个图像之间进行乘积元素明智 MATLAB 的 c opencv 端口不相乘 这是我的代码 include
  • 使用 ecdf 图中的值创建一个表

    我正在尝试使用 ecdf 图中的值创建一个表 我在下面重新创建了一个示例 Data data mtcars Sort by mpg mtcars lt mtcars order mtcars mpg Make arbitrary ranki
  • 如何在 Windows 8 中以编程方式捕捉应用程序?

    如何以编程方式将 Windows 8 应用程序设置为快照视图 另外 如果屏幕分辨率为 1024 并且不允许捕捉会发生什么 调用这个函数会出现异常吗 回答您的问题 如何以编程方式将 Windows 8 应用程序设置为快照视图 看来这是不可能的
  • jQuery 对话框底部的箭头

    我在用着jQuery 对话框我需要在底部中心显示一个箭头提示jQuery Dialog像下面这样 我怎样才能做到这一点 一种想法是使用 after and before伪元素放置 2 个 CSS 三角形 参见CSS 三角形是如何工作的 彼此
  • IndexError:数组索引太多

    我知道有大量这样的线程 但所有这些线程都适用于非常简单的情况 例如 3x3 矩阵和此类事物 并且这些解决方案甚至不适用于我的情况 所以我试图绘制 G 与 l1 的关系图 这不是 11 而是 L1 数据位于我从 Excel 文件加载的文件中
  • 在Python中打开数百万个numpy.memmap

    我有一个由数百万个训练示例组成的数据库 每个都保存为自己的numpy memmap 是的 是的 我知道 但它们的大小不规则 我可能会修改我的设计 将类似大小的示例放在一个内存映射中 并向用户隐藏这一事实 尝试打开此数据库会导致我进入系统NO
  • 将 Windows 窗体表单的元素重置为初始化状态 (C#/.NET) [关闭]

    Closed 这个问题是无关 目前不接受答案 我正在建造一个Windows 窗体C 中的表单 面板中的各种元素一开始不可见 禁用或设置为 null 标签 组合框 网格等 当用户浏览并做出选择时 这些元素会被填充 选择等 这个想法是上传文件
  • 获取JavaScript承诺值[重复]

    这个问题在这里已经有答案了 我有一个 json 文件 我正在尝试读取其内容以在脚本中使用 我使用以下命令来获取 json const json fetch Data my data json then response gt respons
  • Django,检索IP位置

    我想通过从 IP 地址检测用户的位置 将用户重定向到网站中的特定位置区域 在 Django 1 1 1 下实现这一目标的最佳方法是什么 Thanks Edit 我想要基于欧洲的城市定位 地理Django看起来它会满足您的需求 我不确定您到底
  • 如何使用功能代码删除 WSS 3 中的“个性化此页面”选项?

    如何删除 WSS 3 0 中的 个性化此页面 选项 如果可能的话 我想用具有 Web 应用程序级别功能的代码来完成此操作 It s a 允许可以在WSS的Web UI中访问 站点设置 gt 人员和组 在用户和权限下 gt 站点权限 左侧快速
  • 我的控制器中的非静态字段、方法或属性需要对象引用[重复]

    这个问题在这里已经有答案了 可能的重复 非静态字段 方法或属性需要对象引用 我有一个非静态字段 private IDictionary
  • Mongodb 与 Monk:如果数据库关闭,错误捕获和处理

    我是蒙戈的新手 我需要一个简单项目的数据库 最终遵循了使用 Mongo 和 Monk 的教程 但我在理解如何处理错误方面遇到了问题 背景 我在客户端有一个注册表 当用户单击按钮时 数据通过 AJAX 发送到控制器 经过验证 但现在不相关 该