Асинхронная функция выдает ошибку - но экспресс-точка, которая ее вызывает, - не видит ее - PullRequest
0 голосов
/ 08 июня 2018

У меня есть вспомогательная функция, которая обращается к API и извлекает страницу по идентификатору.Он использует async / await, и я пытаюсь обработать ошибки с помощью try catch.

Чтобы проверить обработку ошибок, я намеренно даю ему идентификатор, который не существует.

Вот метод:

  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 голосов
/ 08 июня 2018

Что я вижу из вашего кода, так это то, что ваш блок 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
    }
  }
0 голосов
/ 08 июня 2018

Вы ловите ошибку в 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()
...