Почему это так?
Это связано с тем, что браузеры отправляют дополнительный запрос для получения favicon ;Когда вы переходите на localhost:8080
, chrome (или firefox) отправляет запрос get
на /
, следовательно, ваш сервер соответствует этому маршруту и регистрирует:
in route handler
Сразу после этого он отправляет вторую get
запрос к /favicon.ico
, но ваш сервер не соответствует ни одному маршруту.он продолжает свой путь к промежуточному программному обеспечению, смонтированному после маршрутизации, и записывает в журнал:
in middleware
...........
Конечно, вызвав next()
, вы явно вызвали свое промежуточное программное обеспечение после двух вышеуказанных запросов и так:
in route handler
in middleware
...........
in middleware
...........
Но я подумал, что если это было после обработчиков маршрутов, то для достижения промежуточного программного обеспечения предшествующий ему обработчик маршрута должен вызвать следующий
Конечно, вы правы.Добавьте serve-favicon
промежуточное программное обеспечение в свое приложение, и ваше пользовательское промежуточное программное обеспечение никогда не будет вызываться без явного вызова next()
, если ни один из маршрутов не будет сопоставлен:
const express = require('express');
var favicon = require('serve-favicon')
var path = require('path')
var app = express()
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')))
app.get('/', (req, res, next) => {
console.log('in route handler')
res.send('Hello World')
});
app.use((req,res, next) => {
console.log('in middleware')
console.log('...........')
})
app.listen(process.env.PORT || 8080)
Кстати, это промежуточное ПО, смонтированное после всех маршрутов,подходящее место для обработки 404-х, потому что если мы доберемся до этой точки, ни один из маршрутов наших приложений не будет найден.