我的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块来处理错误。
问题:有人可以向我解释为什么我得到此错误以及如何解决该错误吗?
答案 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()方法才能解决问题