Nodejs с экспрессом: почему мое промежуточное ПО выполняется дважды Вот код

Это мой код здесь ..!

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

let myFunc = function (req, res, next) {
    console.info('This is middleware');
    next();
}

app.use(myFunc);

app.get('/', (req, res) => {
    console.info('This is get /');
    res.send('Hello World!');
});

app.listen(3000, () => {
    console.info('Server is running at port 3000....');
});

В этом я создал промежуточное ПО под названием myFunc, но результат не такой, как я думал.

Server is running at port 3000....
This is middleware
This is get /
This is middleware

Добавьте console.info(req.url) в промежуточное ПО. Бьюсь об заклад, браузер запрашивает значок.

Yury Tarabanko 30.11.2018 13:05

Я думаю, что другой запрос - для значка

Prakash Sharma 30.11.2018 13:05

другой - для значка!

Amir Hossein 05.03.2021 21:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
3 534
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

app.use запускается каждый раз, когда вы запускаете приложение. в этом случае вы запускаете дважды. app.get и app.listen

Хммммм, вы в этом уверены? Ни объявление маршрута, ни запуск сервера не должны запускать промежуточное ПО или как-то повторно запускать app.use.

Yury Tarabanko 30.11.2018 13:14

Нет, он не работает. Я попытался удалить app.get, но затем он выполнил дважды!

Aditya Pradhan 30.11.2018 13:16

Нет, я запустил сервер и перезагрузил страницу. Я получил ошибку на веб-странице, что вполне приемлемо, но затем она выполняется дважды!

Aditya Pradhan 30.11.2018 13:18

@AdityaPradhan Этот ответ не имеет смысла. Я уверен, что браузер отправляет еще один запрос с запросом значка. Вы можете легко проверить это, сделав запрос с помощью curl curl http://localhost:3000. Промежуточное ПО будет запускаться только один раз.

Yury Tarabanko 30.11.2018 13:20

это не мнение, это из документации: промежуточное ПО, смонтированное без пути, будет выполняться для каждого запроса к приложению

David White 30.11.2018 13:22

Да для каждого запрос Ни app.get, ни app.listen не запрашивают.

Yury Tarabanko 30.11.2018 13:25

@YuryTarabanko Да, я думаю, что вы правы, когда я попросил использовать Postman, он сработал, а промежуточное ПО было выполнено только один раз

Aditya Pradhan 30.11.2018 13:32

ни app.get, ни app.listen не вызывают его функцию. Вместо этого каждый запрос, поступающий из браузера, вызывает его функцию.

Intervalia 08.07.2019 21:14

As @DavidWhite said app.use is running every time you trigger app. in this case you trigger twice. app.get and app.listen You should use the middleware this way

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

let myFunc = function (req, res, next) {
    console.info('This is middleware');
    next();
}

app.get('/', myFunc,(req, res) => {
    console.info('This is get /');
    res.send('Hello World!');
});

app.listen(3000, () => {
    console.info('Server is running at port 3000....');
});

Когда вы используете app.use(myFunc);, вы применяете промежуточное ПО ко всем приложениям. И вы используете app.get и app.listen, поэтому промежуточное ПО запускается дважды. Попробуйте использовать middlewere в запросе get

Я пытался удалить app.get, но он все равно запускается дважды!

Aditya Pradhan 30.11.2018 13:24

Да, это нормально, потому что вы используете функцию промежуточного программного обеспечения без пути монтирования. Этот код выполняется для каждого запроса к маршрутизатору. Не понимаю, почему он вызывается дважды, пожалуйста, добавьте console.info (req.url) в промежуточное ПО, как упомянул @Yuri.

Vahe Akhsakhalyan 30.11.2018 13:34

ни app.get, ни app.listen не вызывают его функцию. Вместо этого каждый запрос, поступающий из браузера, вызывает его функцию.

Intervalia 08.07.2019 21:14

Ваши статические файлы также имеют тот же URL-адрес, что и тот, который вы пытаетесь использовать. Так что, скорее всего, у вас будет что-то вроде этого: localhost: 3000 /: переменная

Здесь этот URL будет соответствовать многим материалам

Это происходит потому, что браузер запрашивает два файла. Первый будет для /, а второй, скорее всего, для favicon.ico. Если вы хотите увидеть Зачем, который вызывается, измените свою единственную функцию, чтобы она выглядела так:

let myFunc = function (req, res, next) {
  console.info('This is middleware', req.originalUrl);
  next();
}

Затем он будет выводить URL-адрес, который запрашивался каждый раз, когда браузер обращается к серверу.

Ты совершенно прав. Это из-за файла favicon.ico. Браузер отправляет запрос дважды: 1 для «/» и 1 для «/favicon.ico» ... Большое спасибо.

Rufat Gulabli 04.11.2019 13:00

Другие вопросы по теме