异步函数抛出错误 - 但表达调用它的端点 - 没有看到它

时间:2018-06-07 23:00:19

标签: node.js error-handling async-await try-catch express-4

我有一个辅助函数,可以访问API并按ID获取页面。它使用async / await,我试图用try catch处理错误。

为了测试错误处理,我故意给它一个不存在的ID。

以下是方法:

  const findPage = async (req, res, pageId) => {
    let document
    try {
      let response = await getByID(pageId)
      if (!response) throw Error('No Response')
      return document
    } catch (error) {
      console.log(error) // I can see the error is being thrown.. I am purposefuly giving it an id that does not exist
      return error
    }
  }

确实会像我期望的那样抛出错误。但是,我使用快速路由在应用程序的另一部分调用该函数。

Router.route('/page/:id').get(async (req, res) => {
  let results
  try {
    results = await findPage(req, res, req.params.id) // This Function Returns an error
    // Yet we still get results
    res.json({results, msg: 'WHY?'})
  } catch (error) {
    res.send(error)
  }
})

在同一个路由器文件中,我也试图将一些特定的中间件添加到此路由器中,但由于没有错误,因此永远不会触发。

Router.use((err, req, res, next) => {
  if (err) {
    console.log('holy error')
  } else {
    console.log('no error')
  }
  next(err)
})

当它调用的函数本身返回错误时,快速API调用如何返回结果而不是错误?

2 个答案:

答案 0 :(得分:1)

我从你的代码中看到的是Router.route中的try / catch块没有捕获findPage函数的一个消息,这是因为你也在findPage内捕获异常{ {1}}只是简单地返回错误而不是抛出异常;

try {
  results = await findPage(req, res, req.params.id) // This Function Returns an error
  // Yet we still get results
  res.json({results, msg: 'WHY?'})
} catch (error) {
  res.send(error)
}

所以在findPage内部,如果你真的需要在发生排序时做一些事情,那么你必须抓住它,如果你喜欢调用者也抓住了你需要抛出相同的错误或新的更多上下文感知再次出错。否则,如果你在异常发生时不做任何动作,你就不需要抓住它。

const findPage = async (req, res, pageId) => {
    let document
    try {
      let response = await getByID(pageId)
      if (!response) throw Error('No Response')
      return document
    } catch (error) {
      // do something here if you really need to otherwise you dont need to catch exceptions here
      // then rather than `return error` you should 
      throw error
    }
  }

答案 1 :(得分:0)

您正在捕捉findPage()中的错误,这意味着错误不会传播到调用堆栈中。您只是将错误返回为正常值,该值将最终位于results函数中的变量Routes中。如果您想在两个地方处理错误,则需要throw再次findPage()



async function callee(){
  try {
    throw("Some Error")
  } catch(err) {
    console.log("caught error in callee:", err)
    throw(err)
  }
}
async function caller(){
  try {
   let val =  await callee()
   console.log("returned value", val)
  } catch (err) {
    console.log("caught error in caller: ", err)
  }
}

caller()




如果你不想在这两个地方处理它,catch它在负责处理错误的函数中:



async function callee(){
  throw("Some Error")
}
async function caller(){
  try {
   let val =  await callee()
   console.log("returned value", val)
  } catch (err) {
    console.log("caught error in caller: ", err)
  }
}

caller()