- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我是 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 liketry..catch
valid again, since you can actually scope as blocks rather than usingPromise.catch()
orerr
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/
reqwest v0.9 将 serde v1.0 作为依赖项,因此实现 converting serde_json errors into reqwest error . 在我的代码中,我使用 se
我有这个代码: let file = FileStorage { // ... }; file.write("Test", bytes.as_ref()) .map_err(|e| Mu
我只是尝试用angular-cli创建一个新项目,然后运行服务器,但是它停止并显示一条有趣的消息:Error: No errors。 我以这种方式更新了(希望有帮助):npm uninstall -g
我从我的 javascript 发送交易 Metamask 打开传输对话框 我确定 i get an error message in metamask (inpage.js:1 MetaMask -
这个问题在这里已经有了答案: How do you define custom `Error` types in Rust? (3 个答案) How to get a reference to a
我想知道两者之间有什么大的区别 if let error = error{} vs if error != nil?或者只是人们的不同之处,比如他们如何用代码表达自己? 例如,如果我使用这段代码: u
当我尝试发送超过 50KB 的图像时,我在 Blazor 服务器应用程序上收到以下错误消息 Error: Connection disconnected with error 'Error: Serv
我有一个error-page指令,它将所有异常重定向到错误显示页面 我的web.xml: [...] java.lang.Exception /vi
我有这样的对象: address: { "phone" : 888, "value" : 12 } 在 WHERE 中我需要通过 address.value 查找对象,但是在 SQL 中有函数
每次我尝试编译我的代码时,我都会遇到大量错误。这不是我的代码的问题,因为它在另一台计算机上工作得很好。我尝试重新安装和修复,但这没有帮助。这是整个错误消息: 1>------ Build starte
在我的代码的类部分,如果我写一个错误,则在不应该的情况下,将有几行报告为错误。我将'| error'放在可以从错误中恢复的良好/安全位置,但是我认为它没有使用它。也许它试图在某个地方恢复中间表情? 有
我遇到了 csv 输入文件整体读取故障的问题,我可以通过在 read_csv 函数中添加 "error_bad_lines=False" 来删除这些问题来解决这个问题。 但是我需要报告这些造成问题的文
在 Spring 中,验证后我们在 controller 中得到一个 BindingResult 对象。 很简单,如果我收到验证错误,我想重新显示我的表单,并在每个受影响的字段上方显示错误消息。 因此
我不知道出了什么问题,因为我用 Java 编程了大约一年,从来没有遇到过这个错误。在一分钟前在 Eclipse 中编译和运行工作,现在我得到这个错误: #A fatal error has been
SELECT to_char(messages. TIME, 'YYYY/MM/DD') AS FullDate, to_char(messages. TIME, 'MM/DD
我收到这些错误: AnonymousPath\Anonymized.vb : error BC30037: Character is not valid. AnonymousPath\Anonymiz
我刚刚安装了 gridengine 并在执行 qstat 时出现错误: error: commlib error: got select error (Connection refused) erro
嗨,我正在学习 PHP,我从 CRUD 系统开始,我在 Windows 上安装了 WAMP 服务器,当我运行它时,我收到以下错误消息。 SCREAM: Error suppression ignore
我刚刚开始一个新项目,我正在学习核心数据教程,可以找到:https://www.youtube.com/watch?v=zZJpsszfTHM 我似乎无法弄清楚为什么会抛出此错误。我有一个名为“Exp
当我使用 Jenkins 运行新构建时,出现以下错误: "FilePathY\XXX.cpp : fatal error C1853: 'FilePathZ\XXX.pch' precompiled
我是一名优秀的程序员,十分优秀!