Express 错误处理程序是如何工作的?

Express 错误处理程序是如何工作的?,express,Express,如何触发 在示例代码中,我发现它位于所有中间件函数的底部。这个职位重要吗?你可以参考下面的例子了解一些细节。 这里,对于“/”GET端点,中间件显式抛出一个错误“problem error”。 此时,express错误处理程序机制被触发,它将查找错误处理程序(err作为参数)。因此,后续的“Hello”不会发送回客户机,因为其处理程序不是错误处理程序 随后的错误处理程序logErrors、clientErrorHandler和errorHandler被逐个调用,以执行相关任务,最后一个将写回响应

如何触发


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

你可以参考下面的例子了解一些细节。 这里,对于“/”GET端点,中间件显式抛出一个错误“problem error”。 此时,express错误处理程序机制被触发,它将查找错误处理程序(err作为参数)。因此,后续的“Hello”不会发送回客户机,因为其处理程序不是错误处理程序

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

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

const express=require('express');
常量app=express();
app.get('/',(请求,res,next)=>next(新错误('problem Error'),(请求,res)=>{
回复状态(200)。发送(“你好”);
});
应用程序使用(日志错误);
应用程序使用(clientErrorHandler);
应用程序使用(errorHandler);
函数日志错误(err、req、res、next){
控制台错误(错误堆栈)
下一个(错误)
}
函数clientErrorHandler(err、req、res、next){
如果(请求xhr){
res.status(500).send({error:'Something failed!'})
}否则{
下一个(错误)
}
}
函数errorHandler(err、req、res、next){
如果(res.headersSent){
返回下一个(错误)
}
资源状况(500)
res.render('error',{error:err})
}

app.listen(3000,()=>console.log('Example app listening on port 3000!'))
我可以理解这四个参数是否用于处理所有抛出错误。但是,您的
next
如何调用/get的路由以在错误处理程序中结束呢?因为我使用显式的错误对象调用next()。因此,中间件链中的下一个错误处理程序将被调用,在上述情况下,它是logErrors。从官方文档中,“下一个(err)将跳过链中所有剩余的处理程序,但设置为如上所述处理错误的处理程序除外。”