繁体   English   中英

错误处理程序如何工作?

[英]How does the Error Handler work?

错误处理程序如何触发?

在示例代码中,我发现它位于所有中间件功能的底部。 这个职位重要吗?

您可以参考以下示例以了解一些详细信息。 在这里,对于“ /” GET端点,中间件显式抛出错误“问题错误”。 此时,将触发快速错误处理程序机制,并寻找一个错误处理程序(以err作为参数)。 结果,后续的“ Hello”不会发送回客户端,因为其处理程序不是错误。

随后的错误处理程序logErrors,clientErrorHandler和errorHandler被一个接一个地调用以执行相关任务,最后一个则写回响应。

将它们放置在末尾的原因是捕获声明的中间件引发的错误并对其进行优雅处理(即打印,记录日志,发送邮件等)。可以使用其他语言(如Java)中的try catch机制来考虑它。 如果在其他中间件之上声明,则它们将变得无用,因为不会处理错误。 通过将“ GET”请求的顺序与错误处理程序交换,可以看到输出的差异。

 const express = require('express'); const app = express(); app.get('/', (req, res, next) => next(new Error('problem error')), (req, res) => { res.status(200).send("Hello"); }); app.use(logErrors); app.use(clientErrorHandler); app.use(errorHandler); function logErrors (err, req, res, next) { console.error(err.stack) next(err) } function clientErrorHandler (err, req, res, next) { if (req.xhr) { res.status(500).send({ error: 'Something failed!' }) } else { next(err) } } function errorHandler (err, req, res, next) { if (res.headersSent) { return next(err) } res.status(500) res.render('error', { error: err }) } app.listen(3000, () => console.log('Example app listening on port 3000!')) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM