首页 > 解决方案 > 使用 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}`));
}

标签: javascriptnode.jsmongodb

解决方案


  • 首先,在我看来,将 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);
  }  
});

推荐阅读