javascript - 使用 mongodb 时如何将错误传递给节点中的父函数
问题描述
我正在构建一个简单的 API 来更新记录,然后发送响应(使用 MonogoDB)。
它运行良好,但是我试图弄清楚如何最好地处理错误并将它们传递给路由器功能,以响应错误。我一直在做很多阅读,但无法弄清楚。
在下面的示例中,请求到达/endpoint
,然后调用异步函数,命名为updateQuery
。
我相信我可以得到两种类型的失败错误;1) MongoError和 2) 我尝试更新记录但没有更新的错误 - 例如,我尝试更新不存在的记录。
如果发生 MongoError - 这些会catch()
被updateQuery
. 在这种情况下,我的问题是,由于这被函数catch()
中的块捕获,updateQuery
我该如何将此错误传递给路由器函数,以响应错误状态代码?
在第二种情况下,如下例所示,我可以使用语句查看是否没有更新任何内容if
,但是我再次不确定如何将其传递给路由器函数以发出响应。我使用if else
声明吗?即如果结果== true,则继续,否则显示错误?
谢谢
路由器功能
router.put("/endpoint", async (req, res) => {
await updateQuery()
.then(() => {
res.status(200).json({ status: 201 });
})
.catch((err) => console.error(`Fatal error occurred: ${err}`));
});
更新查询函数
async function updateQuery() {
const db = await mongoUtil.getDb();
return await db
.collection("test")
.updateOne(
{
_id: <id>,
},
{
$set: {
param: 'test'
},
}
)
.then((result) => {
if (result.nModified !== 1) {
throw new Error("Update Error");
}
})
.catch((err) => console.error(`Fatal error occurred: ${err}`));
}
解决方案
- 首先,在我看来,将 async/await 与 then/catch 一起使用有点多余。
- 其次,您可以只在顶级函数中使用catch,任何错误要么由您抛出,要么服务器将被捕获。
- 最后,express 是一个基于中间件的框架,路由处理程序可以接收另一个参数“next”,它是链中的下一个处理程序,也将接收您传递给它的请求、响应和其他参数,所以对于例如,您可以添加一个中间件,该中间件根据收到的错误创建响应。然后你可以使用类似的东西,
.catch((error) => next(error))
或者使用 try/catch 语法。
所以你的最终代码看起来像这样:
router.put("/endpoint", async (req, res, next) => {
try {
await updateQuery()
res.status(200).json({ status: 201 });
} catch(error) {
next(error);
}
});
推荐阅读
- regex - Unicode 字符串
- python - Python测验程序问题与分数
- java - 如果文本字段不是数值,如何创建错误消息?
- python - 有没有一种方法可以让我在 doc2vec 中获得每个段落的等效向量列表?
- php - 没有对应视图的 URL
- javascript - Twitter Bootstrap 4 模态框不会在 Chrome 中显示
- javascript - 打字稿和反应条件渲染
- javascript - 当我将纯 React 重新制作为 Redux 时,我需要在这一行中写什么而不是点?
- php - 计算php命令执行的执行时间(popen()函数)
- solr - apache solr 使用 xml 文档索引 pdf 文件