Во-первых, браузер отправляет два запроса на ваш сервер:
/add-product
/favicon.ico
Затем, чтобы понять маршрутизацию, вы должны понимать разницу в сопоставлении маршрутов между app.use()
и app.get()
.
app.get()
соответствует, только если определение маршрута соответствует всему запрошенному URL . То же самое верно для app.post()
, app.put()
, app.delete()
и app.all()
.
app.use()
совпадений, если определение маршрута по крайней мере частичное совпадение с запрошенным URL,
Также обратите внимание, что app.get()
соответствует только запросам GET, в то время как app.use()
соответствует любому глаголу HTTP (включая POST, PUT, DELETE), хотя это различие не имеет значения в данном конкретном примере, поскольку оба запроса, происходящие здесь GET запросы.
На самом деле, разница между app.use()
и app.all()
(которые оба соответствуют любому глаголу HTTP) заключается в том, что app.all()
требуется полное совпадение, а app.use()
принимает только частичное совпадение.
Также маршруты проверяются на совпадения в порядке, указанном в вашем коде.
Маршрут / add-product
Итак, когда браузер запросы /add-product
, вы получите:
app.use('/', ...)
совпадений, потому что /
частичное совпадение с /add-product
.
app.use('/add-product', ...)
совпадений, поскольку /add-product
совпадение с /add-product
Затем маршрут /add-product
отправляет ответ и не вызывает next()
, поэтому маршрутизация выполняется для этого запроса, а третий маршрут вообще не проверяется.
/Favicon.ico маршрутизация
Затем, когда запрос браузера s /favicon.ico
, вы получите следующее:
app.use('/', ...)
соответствует, потому что /
является частичным совпадением с /favicon.ico
.
app.use('/add-product', ...)
не совпадает, потому что оно не является по крайней мере частичное совпадение для /favicon.ico
Затем он проверяет ваш третий маршрут на этот раз, и это частичное совпадение для app.use('/', ...)
, который отправляет ответ и не вызывает next()
, поэтому для этого выполнена маршрутизация request.
Примечание. Важно правильно выбрать app.get()
или app.use()
.