当使用另一个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)
答案 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