Javascript 使用mongodb时如何将错误传递给节点中的父函数

Javascript 使用mongodb时如何将错误传递给节点中的父函数,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我正在构建一个简单的API来更新记录,然后发送响应(使用MonogoDB) 它工作得很好,但我试图找出如何最好地处理错误,并将它们传递给路由器功能,以响应错误。我一直在读很多书,但是我想不出什么 在下面的示例中,一个请求到达/endpoint,然后调用一个异步函数,名为updateQuery 有两种类型的失败错误,我相信我可以得到;1) MongoError和2)错误,其中我尝试更新记录,但未更新任何内容-例如,我尝试更新不存在的记录 如果出现MongoError-这些错误将被updateQue

我正在构建一个简单的API来更新记录,然后发送响应(使用MonogoDB)

它工作得很好,但我试图找出如何最好地处理错误,并将它们传递给路由器功能,以响应错误。我一直在读很多书,但是我想不出什么

在下面的示例中,一个请求到达
/endpoint
,然后调用一个异步函数,名为
updateQuery

有两种类型的失败错误,我相信我可以得到;1) MongoError和2)错误,其中我尝试更新记录,但未更新任何内容-例如,我尝试更新不存在的记录

如果出现MongoError-这些错误将被
updateQuery
中的
catch()
块拾取。在这种情况下,我的问题是,由于这被
updateQuery
函数中的
catch()
块捕获,因此如何将此错误传递给路由器函数,以使用错误状态代码进行响应

在第二个场景中,如以下示例中所示,我可以使用
if
语句查看是否没有更新任何内容,但是我仍然不确定如何将其传递给路由器函数以发出响应。我是否使用
if-else
语句?i、 e如果结果==真,则继续,否则显示错误

谢谢

路由器功能

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}`));
}
更新功能

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}`));
}
异步函数updateQuery(){ const db=wait mongoUtil.getDb(); 返回等待数据库 .收集(“测试”) .updateOne( { _id:, }, { $set:{ 参数:“测试” }, } ) 。然后((结果)=>{ 如果(result.nModified!==1){ 抛出新错误(“更新错误”); } }) .catch((err)=>console.error(`发生致命错误:${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);
  }  
});

您可以从捕获中重新抛出错误,但始终要问为什么要首先捕获它