终于有点懂了,, 所有被 app.use() 接收的 handle 会被放到一个 stack 里边
app.get() 执行的时候会把一条路由规则添加到 stack 里..
然后顺序检索 statck 直到结束, 那么执行这段代码给出 404
https://github.com/senchalabs/connect/blob/master/lib/proto.js#L122
// all done
if (!layer || res.headerSent) {
// delegate to parent
if (out) return out(err);
// unhandled error
if (err) {
// default to 500
if (res.statusCode < 400) res.statusCode = 500;
debug('default %s', res.statusCode);
// respect err.status
if (err.status) res.statusCode = err.status;
// production gets a basic error message
var msg = 'production' == env
? http.STATUS_CODES[res.statusCode]
: err.stack || err.toString();
// log to stderr in a non-test env
if ('test' != env) console.error(err.stack || err.toString());
if (res.headerSent) return req.socket.destroy();
res.setHeader('Content-Type', 'text/plain');
res.setHeader('Content-Length', Buffer.byteLength(msg));
if ('HEAD' == req.method) return res.end();
res.end(msg);
} else {
debug('default 404');
res.statusCode = 404;
res.setHeader('Content-Type', 'text/plain');
if ('HEAD' == req.method) return res.end();
res.end('Cannot ' + req.method + ' ' + utils.escape(req.originalUrl));
}
return;
}
不过这样的话,, 自己定义 404 页面是怎样做到的
https://github.com/visionmedia/express/blob/master/examples/error-pages/index.js#L45