中间件中的错误处理程序,其中中间件是未调用的表达实例

时间:2016-08-05 17:20:13

标签: express

当使用另一个express实例作为中间件时,第二个实例的.use工作正常,除了作为错误处理程序,err作为第一个参数

var app = require("express")()
var app2 = require("express")()
app.get("/", function(req, res){
  res.send("normal response")
})
app.get("/err", function(req, res){
  throw new Error()
})
app2.use(function(req, res, next){
  res.send("404") // this works
})
app2.use(function(err, req, res, next){
  res.send("error") // this does not work
})
app.use(app2)
app.listen(3000)

1 个答案:

答案 0 :(得分:0)

从查看代码看,Express看起来像这样:

应用程序(或更确切地说,路由器)维护stack "layers",其中图层可以是路由处理程序,中间件处理程序或错误处理程序。

请求通过此堆栈传递:每个层都是checked,以查看它是否可以处理请求。如果是,好吧,如果没有,it's passed to the next layer

如果图层处理请求时发生错误,请快速runs 当前图层堆栈中的错误(这很重要),以查看其中一个图层是否为错误处理程序如果是这样,它将处理错误,否则通用错误处理程序将处理它。

现在,一个新的应用程序被添加到图层堆栈中:

app.use(app2);

应用程序本身基本上是一个中间件处理程序,因此它会被询问(如路由处理程序)它是否可以处理请求。它将接受它,然后通过层堆栈传递请求。同样,如果此处发生错误,错误将在堆栈中运行,以查看是否有错误处理程序来处理它。

但是,如果app2中没有错误处理程序,则错误将传递回app,这意味着app2图层会引发错误(就像表示错误的图层一样) /err的路由处理程序可能会抛出错误。)

因此,此错误将在app的堆栈中向下运行以搜索错误处理程序。

TL; DR:错误只会传播到#34;向上",传播到顶级应用(在您的情况下为app),而不是向下传播(从app传播到{{1 }})。

因此,如果您需要通用错误处理程序,则需要在app2上声明它,并且只有在您声明了任何子应用程序之后:

app