2016-12-29 50 views
2

我期待通过快递发生器产生app.js,并有下面的代码:为什么下面的处理程序确定为404处理器

app.use('/', index); 
app.use('/users', users); 

// catch 404 and forward to error handler 
app.use(function (req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

我的问题是,为什么在过去的中间件功能被确定为函数当not found错误应该返回时执行?

是否基于这样的假设:如果调用此函数,则意味着没有其他中间件/路由器函数完成处理与res.send()的请求,因此对请求不感兴趣,因此可能没有处理请求的处理程序?如果是这样,那么应该总是最后添加这个处理函数,正确吗?

+0

是的,没错。这是因为它是最后一个,即*没有更多有效的路由,因此这必须是一个错误。* –

+0

是的,它完全如您所述 –

回答

2

正是如你所说,在http://expressjs.com/en/starter/faq.html

表示如何处理404升的反应? 在Express中,404响应不是 错误的结果,所以错误处理程序中间件将不会捕获 它们。这种行为是因为404响应只是表示 没有额外的工作要做;换句话说,Express已经执行了所有中间件功能和路由,并且发现它们中的任何一个都不会响应 。所有你需要做的是在非常 底部的堆栈(下面的所有其他功能)的添加中间件函数来处理404 响应:

app.use(function (req, res, next) { 
    res.status(404).send("Sorry can't find that!") 
}) 
+0

谢谢,但其他一些中间件功能可能仍然写入响应,正确? –

+2

是的,它可以写入响应并仍然调用next()来进入下一个处理程序。 –

+0

@HunterMcMillen,谢谢 –

相关问题