- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 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 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 与 Monk : error catching and handling if db is down,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46309779/
我有一个 html 格式的表单: 我需要得到 JavaScript在value input 字段执行,但只能通过表单的 submit .原因是页面是一个模板所以我不控制它(不能有
我管理的论坛是托管软件,因此我无法访问源代码,我只能向页面添加 JavaScript 来实现我需要完成的任务。 我正在尝试用超链接替换所有页面上某些文本关键字的第一个实例。我还根据国家/地区代码对这些
我正在使用 JS 打开新页面并将 HTML 代码写入其中,但是当我尝试使用 document.write() 在新页面中编写 JS 时功能不起作用。显然,一旦看到 ,主 JS 就会关闭。用于即将打开的
提问不是为了解决问题,提问是为了更好地理解系统 专家!我知道每当你将 javascript 代码输入 javascript 引擎时,它会立即由 javascript 引擎执行。由于没有看过Engi
我在一个文件夹中有两个 javascript 文件。我想将一个变量的 javascript 文件传递到另一个。我应该使用什么程序? 最佳答案 window.postMessage用于跨文档消息。使
我有一个练习,我需要输入两个输入并检查它们是否都等于一个。 如果是 console.log 正则 console.log false 我试过这样的事情: function isPositive(fir
我正在做一个Web应用程序,计划允许其他网站(客户端)在其页面上嵌入以下javascript: 我的网络应用程序位于 http://example.org 。 我不能假设客户端网站的页面有 JQue
目前我正在使用三个外部 JS 文件。 我喜欢将所有三个 JS 文件合而为一。 尽一切可能。我创建 aio.js 并在 aio.js 中 src="https://code.jquery.com/
我有例如像这样的数组: var myArray = []; var item1 = { start: '08:00', end: '09:30' } var item2 = {
所以我正在制作一个 Chrome 扩展,它使用我制作的一些 TamperMonkey 脚本。我想要一个“主”javascript 文件,您可以在其中包含并执行其他脚本。我很擅长使用以下行将其他 jav
我有 A、B html 和 A、B javascript 文件。 并且,如何将 A JavaScript 中使用的全局变量直接移动到 B JavaScript 中? 示例 JavaScript) va
我需要将以下整个代码放入名为 activate.js 的 JavaScript 中。你能告诉我怎么做吗? var int = new int({ seconds: 30, mark
我已经为我的 .net Web 应用程序创建了母版页 EXAMPLE1.Master。他们的 I 将值存储在 JavaScript 变量中。我想在另一个 JS 文件中检索该变量。 示例1.大师:-
是否有任何库可以用来转换这样的代码: function () { var a = 1; } 像这样的代码: function () { var a = 1; } 在我的浏览器中。因为我在 Gi
我收到语法缺失 ) 错误 $(document).ready(function changeText() { var p = document.getElementById('bidp
我正在制作进度条。它有一个标签。我想调整某个脚本完成的标签。在找到可能的解决方案的一些答案后,我想出了以下脚本。第一个启动并按预期工作。然而,第二个却没有。它出什么问题了?代码如下: HTML:
这里有一个很简单的问题,我简单的头脑无法回答:为什么我在外部库中加载时,下面的匿名和onload函数没有运行?我错过了一些非常非常基本的东西。 Library.js 只有一行:console.log(
我知道 javascript 是一种客户端语言,但如果实际代码中嵌入的 javascript 代码以某种方式与在控制台上运行的代码不同,我会尝试找到答案。让我用一个例子来解释它: 我想创建一个像 Mi
我如何将这个内联 javascript 更改为 Unobtrusive JavaScript? 谢谢! 感谢您的回答,但它不起作用。我的代码是: PHP js文件 document.getElem
我正在寻找将简单的 JavaScript 对象“转储”到动态生成的 JavaScript 源代码中的最优雅的方法。 目的:假设我们有 node.js 服务器生成 HTML。我们在服务器端有一个对象x。
我是一名优秀的程序员,十分优秀!