UnhandledPromiseRejectionWarning:此错误是由于在没有catch块的情况下抛出异步函数而产生的

时间:2018-12-27 05:13:07

标签: javascript node.js express

我的Node-Express应用程序出现以下错误

  

UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个   由抛出异步函数引起的错误   没有障碍,或者拒绝了没有处理的承诺   使用.catch()。 (拒绝ID:4)

至少可以说,我创建了一个类似于以下内容的辅助函数

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

然后导入此辅助函数

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)
})

并像这样在我的api路由中调用它

private void OPCode()
        {
            int.TryParse(Calculations.Text, out int i);
            if (i == 0)
            {
                Calculations.Text = 1.ToString();
            }
        }

从我的角度来看,我认为我正在通过使用catch块来处理错误。

问题:有人可以向我解释为什么我得到此错误以及如何解决该错误吗?

4 个答案:

答案 0 :(得分:5)

.catch(error => { throw error})是禁止操作。导致路由处理程序中的未处理拒绝。

this answer中所述,Express不支持Promise,所有拒绝应手动处理:

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);
  }
})

答案 1 :(得分:1)

我建议从getMails中删除以下代码

 .catch(error => { throw error})

在主要功能中,您应该将“等待”和相关代码放在“尝试”块中,并在失败代码处添加一个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
})

答案 2 :(得分:1)

您正在捕获错误,但随后又将其抛出。您应该尝试更优雅地处理它,否则您的用户将看到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语法。

答案 3 :(得分:0)

我解决了问题。这很简单。如果您检查是否存在问题,可能是因为辅助变量具有空格。为什么呢我不知道,但是您必须使用trim()方法才能解决问题