nodejs 消息中间件,
本文将带您了解Express in Node的错误处理中间件,并介绍如何定义错误处理中间件以及如何与async/await一起使用。希望对你有帮助!
node.js速度课程简介:进入学习
Express的错误处理中间件可以帮助您处理错误,而无需重复相同的工作。假设您直接在快速路由处理器中处理错误:
app.put(/user/:id ,async (req,res)={
让用户
尝试{
user=await user . findoneandupdate({ _ id:req . params . id },req.body)
} catch (err) {
返回资源状态(err.status 500)。json({ message: err.message })
}
return res.json({ user })
})以上代码可以正常工作。但是,如果有数百个接口,那么错误处理逻辑将变得不可维护,因为它已经重复了数百次。
定义错误处理中间件
Express根据中间件函数采用的参数个数分为不同的类型。接受4个参数的中间件函数定义为错误处理中间件,只有在出错时才会被调用。
const app=require(express )()
app.get(* ,函数routeHandler() {
//这个中间件抛出一个错误,Express会直接转到下一个错误处理程序
抛出新错误(“哎呀!”)
})
app.get(* ),(req,res,next)={
//这个中间件不是错误处理程序(只有3个参数),Express会跳过,因为前面的中间件有错误。
Console.log(这里不会打印)
})
//您的函数必须接受4个参数,以便Express将其视为错误处理中间件。
app.use((err,req,res,next)={
res.status(500)。json({ message: err.message })
})Express会自动为你处理同步错误,比如上面的routeHandler()方法。但是,Express不处理异步错误。如果发生异步错误,需要调用next()。
const app=require(express )()
app.get(* ),(req,res,next)={
//next()方法告诉Express转到链中的下一个中间件。
//Express不处理异步错误,所以需要通过调用next()来报告错误。
setImmediate(()={
下一步(新错误(哎呀))
})
})
app.use((err,req,res,next)={
res.status(500)。json({
消息:err.message
})
})记住Express中间件是按顺序执行的。您应该在所有其他中间件之后定义错误处理程序。否则,将不会调用您的错误处理程序:
与 async/await 一起使用
快递抓不住承诺的例外。Express是ES6之前写的,如何处理async/await没有好的解决方案。
例如,以下服务器将永远不会成功发送HTTP响应,因为Promise reject永远不会被处理:
const app=require(express )()
app.get(* ),(req,res,next)={
//异步错误必须由next()报告
返回新承诺((解决,拒绝)={
setImmediate(()=reject(新错误( woops )))
}).接住(下一个)
})
app.use((error,req,res,next)={
console.log(将不打印)
RES . JSON({ message:error . message })
})
App.listen(3000)我们可以封装或者使用现有的库来捕获。
首先,我们简单地封装了一个函数来连接async/await和快速错误处理中间件。
函数wrapAsync(fn) {
返回函数(req,res,next) {
fn(请求,结果,下一个)。接住(下一个)
}
}
app.get(* ,wrapAsync(async (req,res)={
等待新的承诺(resolve=setTimeout(()=resolve(),50))
//异步错误!
抛出新错误(“woops”)
}))使用第三方库express-async-errors,一个简单的ES6 async/await支持hack:
要求(“快速异步错误”)
app.get(* ,async (req,res,next)={
等待新的承诺((resolve)=setTimeout(()=resolve(),50))
抛出新错误(“woops”)
})
最后
快速错误处理中间件允许您以最大化关注点分离的方式处理错误。您不需要处理业务逻辑中的错误。如果使用async/await,甚至不需要try/catch。这些错误将出现在您的错误处理程序中,然后您的错误处理程序可以决定如何响应请求。请确保在您的下一个Express应用程序中充分利用这一强大功能!
更多关于node的信息,请访问:nodejs教程!以上是对Express in Node错误处理中间件细节的简要分析。请多关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。