UnhandledPromiseRejectionWarning: эта ошибка возникла из-за броска внутрь асинхронной функции без блока catch - PullRequest
0 голосов
/ 27 декабря 2018

В моем приложении Node-Express появляется следующая ошибка

UnhandledPromiseRejectionWarning: необработанное отклонение обещания.Эта ошибка возникла либо из-за того, что внутри асинхронной функции возникла ошибка без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch ().(id отклонения: 4)

По меньшей мере, я создал вспомогательную функцию, которая выглядит примерно так

const getEmails = (userID, targettedEndpoint, headerAccessToken) => {
    return axios.get(base_url + userID + targettedEndpoint,  { headers: {"Authorization" : `Bearer ${headerAccessToken}`} })
    .catch(error => { throw error})
}

, а затем импортирую эту вспомогательную функцию

const gmaiLHelper = require("./../helper/gmail_helper")

и вызывая его внутри моего API-маршрута следующим образом

router.get("/emailfetch", authCheck, async (req, res) => {
  //listing messages in users mailbox 
  let emailFetch = await gmaiLHelper.getEmails(req.user._doc.profile_id , '/messages', req.user.accessToken)
  .catch(error => { throw error})
  emailFetch = emailFetch.data
  res.send(emailFetch)
})

С моей стороны, я думаю, что я обрабатываю ошибку, используя catch block.

Вопрос: Может кто-нибудь объяснить мне, почему я получаю ошибку и как ее исправить?

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Вы ловите ошибку, но затем вы ее снова выбрасываете.Вы должны попытаться обработать его более изящно, иначе ваш пользователь увидит 500, внутренний сервер, ошибки.

Возможно, вы захотите отправить ответ, сообщающий пользователю, что пошло не так, а также зарегистрировать ошибку наваш сервер.

Я не уверен, какие именно ошибки может вернуть запрос, возможно, вы захотите вернуть что-то вроде.

router.get("/emailfetch", authCheck, async (req, res) => {
  try {
    let emailFetch = await gmaiLHelper.getEmails(req.user._doc.profile_id , '/messages', req.user.accessToken)
      emailFetch = emailFetch.data
      res.send(emailFetch)
   } catch(error) {
      res.status(error.response.status)
      return res.send(error.message);
    })

})

Этот код необходимо адаптировать для соответствия ошибкам, которыевы получаете от вызова axios.

Я также преобразовал код для использования синтаксиса try и catch, так как вы уже используете async.

0 голосов
/ 27 декабря 2018

.catch(error => { throw error}) не работает.Это приводит к необработанному отклонению в обработчике маршрута.

Как объяснено в в этом ответе , Express не поддерживает обещания, все отклонения должны обрабатываться вручную:

router.get("/emailfetch", authCheck, async (req, res, next) => {
  try {
  //listing messages in users mailbox 
    let emailFetch = await gmaiLHelper.getEmails(req.user._doc.profile_id , '/messages', req.user.accessToken)
    emailFetch = emailFetch.data
    res.send(emailFetch)
  } catch (err) {
    next(err);
  }
})
0 голосов
/ 27 декабря 2018

Я предлагаю удалить приведенный ниже код из getMails

 .catch(error => { throw error})

В вашей основной функции вы должны поместить await и связанный с ним код в блок Try, а также добавить один блок catch, в котором вы используете код ошибки.


ваша функция gmaiLHelper.getEmails должна возвращать обещание, в котором есть отклонение и разрешение.

Теперь при вызове и использовании await поместите это в блок try catch (удалить .catch), как показано ниже.

router.get("/emailfetch", authCheck, async (req, res) => {
  //listing messages in users mailbox 
try{
  let emailFetch = await gmaiLHelper.getEmails(req.user._doc.profile_id , '/messages', req.user.accessToken)
}
catch (error) { 
 // your catch block code goes here
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...