为什么下面的处理程序被识别为404处理程序

我正在通过快递生成器生成的app.js ,并有以下代码:

 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()完成处理请求,因此对请求不感兴趣,所以可能没有处理请求的处理程序? 如果是这样的话,应该总是最后添加404处理函数,是正确的吗?

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

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

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