2

我有一个辅助函数可以访问 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)
})

当调用自身的函数返回错误时,express API 调用如何返回结果而不是错误?

4

2 回答 2

1

我从您的代码中可以看出,您在其中的 try/catch 块Router.route没有捕获findPage函数的扩展,那是因为您还在其中捕获了异常,findPage并且只是简单地返回错误而不是抛出异常;

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
    }
  }
于 2018-06-07T23:45:45.010 回答
0

您正在捕获错误,findPage()这意味着错误不会向上传播到调用堆栈。您只是像正常值一样返回错误,最终会出现在函数中的变量resultsRoutes。如果您想处理这两个地方的错误,您需要在以下位置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()

于 2018-06-07T23:42:01.357 回答