Javascript Express.js 4路由器如何让东西到达404页面

Javascript Express.js 4路由器如何让东西到达404页面,javascript,node.js,express,Javascript,Node.js,Express,express生成器在app.js页面中生成以下代码: app.use('/', routes); 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); }); 然而,在文件中,它说 Since

express生成器在
app.js
页面中生成以下代码:

app.use('/', routes);
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);
});
然而,在文件中,它说

Since path defaults to "/", middleware mounted without a path will be executed for every request to the app.
并给出了这个例子:

// this middleware will not allow the request to go beyond it
app.use(function(req, res, next) {
  res.send('Hello World');
})

// requests will never reach this route
app.get('/', function (req, res) {
  res.send('Welcome');
})
那么,如果没有任何东西可以通过
app.use('/',routes)
行,那么
404
页面(或者
/users
路径)怎么可能到达呢

app.use('/', routes);
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);
});
假设您的app.js具有上述代码(直接来自生成器),并且您的服务器接收到对
/foo
的请求。首先,你的
app.use('/',routes)中间件检查它是否能够处理请求,因为它首先在中间件堆栈中定义。如果
routes
对象包含
/foo
的处理程序,并且该处理程序调用
res.send()
,则服务器已完成处理请求,而中间件的其余部分则不做任何事情。但是,如果
/foo
的处理程序调用
next()
而不是
res.send()
,或者如果
routes
对象根本不包含
/foo
的处理程序,那么我们继续查看中间件列表

app.use('/users',users)中间件不执行,因为请求不是向
/users
/users/*
发出的


最后,404中间件最后执行,因为它是最后定义的。因为它是在没有路由的情况下定义的,所以它对通过前两个中间件的所有请求执行

routes
文件中,没有声明
next()
,因此,我认为它不会“走得更远”,但是转到
/users
确实有效。答案很好。那么,作为后续,如何达到404之后的
500
错误?谢谢,问得好。遗憾的是,我没有另一个很好的答案。我认为如果你的服务器有错误(语法错误,尝试调用不可调用的东西,等等),它只会跳过你的其他中间件和路由处理程序,但是500错误本身是由另一个
应用程序提供的。使用
语句。我认为函数签名中有一些神奇的东西?对于常规中间件,处理函数看起来像
function(req,res,next)
,但是对于错误处理中间件,处理函数看起来像
function(err,req,res,next)
。在上面的示例中,404处理程序调用
next()
,并使用
函数(err,req,res,next)
将处理传递给中间件。我认为express是在根据处理程序中的参数数量推断中间件。另外,请注意,在调用
new error()
之前,404从技术上讲不是一个“错误”,而500错误是一个更直接的错误,它会阻止代码的其他部分执行