UnhandledPromiseRejectionWarning:此错误是由于将异步函数内部抛出而没有catch块引起的

ann*_*123 13 javascript node.js express

我的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})
}
Run Code Online (Sandbox Code Playgroud)

然后我导入此辅助函数

const gmaiLHelper = require("./../helper/gmail_helper")
Run Code Online (Sandbox Code Playgroud)

然后像这样在我的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)
})
Run Code Online (Sandbox Code Playgroud)

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

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

Est*_*ask 11

.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);
  }
})
Run Code Online (Sandbox Code Playgroud)

  • 或者您也可以使用`express-promise-router`替换路由器,因为此软件包可以为您完成工作,而无需再将代码嵌入try catch块中。`const router = require('express-promise-router')();` (2认同)

Sum*_*mer 8

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

 .catch(error => { throw error})
Run Code Online (Sandbox Code Playgroud)

在您的主函数中,您应该将 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
})
Run Code Online (Sandbox Code Playgroud)


tmc*_*col 6

您捕获了错误,但随后又重新抛出它。您应该尝试更优雅地处理它,否则您的用户将看到 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);
    })

})
Run Code Online (Sandbox Code Playgroud)

需要调整此代码以匹配您从 axios 调用中获得的错误。

我还将代码转换为使用 try 和 catch 语法,因为您已经在使用异步。