Обработчики маршрутов проверяются на соответствие пути в том порядке, в котором они были определены.
Как только вы определите это:
app.use(function(req, res, next) {
res.status(404).send("Sorry, that route doesn't exist. Have a nice day :)");
});
Ответ был отправлен, а next()
не был вызван, поэтому больше не будут вызываться обработчики маршрута в цепочке.
Ваш обработчик маршрута 404 должен быть последним определенным обработчиком маршрута. Идея состоит в том, что если никакой другой обработчик маршрута не обработал этот запрос, то у вас его не должно быть, и это должен быть маршрут, для которого вы должны вернуть 404. Но вы можете знать, что никакой другой обработчик маршрута не обработает этот запрос, если вы поместите этот последний в цепочку (и, таким образом, определите его последним, чтобы он был последним в цепочке).
Чтобы объяснить немного больше, каждый раз, когда вы делаете app.use()
, app.post()
или app.get()
или любой другой в этом семействе, он добавляет обработчик маршрута во внутренний массив маршрутизации и добавляет их в этот массив в чтобы код работал. Первый маршрут для регистрации идет в начале массива, последний в конце массива.
Когда поступает запрос, Express запускается с начала этого массива и ищет первый обработчик, который соответствует пути и типу входящего запроса, и вызывает этот обработчик маршрута.
Если этот обработчик маршрута никогда не вызывает next()
, то для этого запроса больше не будут вызываться обработчики маршрута. Это сделано. Если этот обработчик маршрута вызывает next()
, то Express продолжает поиск в массиве следующего подходящего обработчика маршрута.
Итак, вы можете видеть, что ваш обработчик app.use()
404 никогда не вызывает next()
, поэтому Express никогда не будет искать более подходящие обработчики маршрутов для этого запроса и, следовательно, обработчики маршрутов, объявленные после этого, никогда не будут найдены и никогда называется.