express. js поведение при маршрутизации - PullRequest
0 голосов
/ 29 февраля 2020

Я начинаю с express. js и мне интересно, почему следующий код:

const express = require('express'); 
const app = express();


app.use('/', (req, res, next) => {
    console.log('First middleware');
    next();
});

app.use('/add-product', (req, res, next) => {
    console.log('Second middleware');
    res.send('<h1>The add-product page!</h1>');
});

app.use('/', (req, res, next) => {
    console.log('Third middleware');
    res.send('<h1>Hello from Express!</h1>');
});


app.listen(3000);

.. при вызове с localhost:3000/add-product из chrome / firefox et c , выдает

First middleware
Second middleware
First middleware
Third middleware

в консоли?

Ответы [ 3 ]

1 голос
/ 29 февраля 2020

ваш браузер выполняет два сетевых вызова: один на /add-product, а другой на /favicon.ico. проверьте это, изучив вкладку сетевой активности инструментов разработчика вашего браузера, и / или сделайте тот же запрос из командной строки (с помощью wget или аналогичного) и посмотрите, что произойдет.

первый запрос проходит через ваш первый и вторые функции промежуточного программного обеспечения, а второй запрос проходит через ваши первую и третью функции промежуточного программного обеспечения.

1 голос
/ 29 февраля 2020

Во-первых, браузер отправляет два запроса на ваш сервер:

/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().

1 голос
/ 29 февраля 2020

Два журнала в конце - First и Third для запроса favicon.ico. Когда вы возвращаете строку html в /add-product, функция обзора автоматически отправляет запрос наподобие GET favicon.ico.

Если вы хотите предотвратить это, во втором промежуточном программном обеспечении выведите строку html, например:

res.send('<head><link rel="icon" href="data:,"></head><h1>The add-product page!</h1>');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...