Возникают трудности с пониманием потока промежуточного программного обеспечения при использовании express.static(‘public’)

#express #middleware

#выражать #промежуточное программное обеспечение #экспресс

Вопрос:

Сейчас я изучаю Express, и у меня возникают трудности с пониманием потока промежуточного программного обеспечения в Express. Например, если у меня есть следующий код, импортируйте express из ‘express’;

 const app = express();

app.use((req,res,next)=>{
    console.log("app.use");
    res.send("hello")
})

app.use(express.static('public'));


app.listen(1234,()=>{
    console.log("started at port:1234");
});
  

Я получу следующее в терминале started at port:1234, app.use и «привет» в браузере, когда я наберу localhost:1234 в своем браузере. Я понимаю это, поскольку первое промежуточное программное обеспечение имеет res.send («привет»), и поэтому оно отправляет обратно «привет», не передавая res в app.use(express.static(‘public’)) (общая папка имеет index.html что в данном случае не показано)

но когда я немного изменил код, я больше не понимал поток промежуточного программного обеспечения

 const app = express();

app.use(express.static('public'));

app.use((req,res,next)=>{
    console.log("app.use");
    res.send("hello")
})


app.listen(1234,()=>{
    console.log("started at port:1234");
});
  

На этот раз я получу следующее в терминале started at port:1234 app.use app.use app.use и index.html когда я набираю localhost:1234 в своем браузере.
Во-первых, я не понимаю, почему я не получаю «привет» в свой брауер. Я понимаю, app.use(express.static('public')); но app.use появляется после того, как app.use(express.static('public')); внутри него есть res.send («hello»), и поэтому отправленный обратно запрос должен быть «hello» вместо index.html ?
Во-вторых, почему терминал показывает «app.use» более одного раза? app.use((req,res,next)=>{console.log("app.use");res.send("hello")}) следует ли выполнять только один раз? Не говоря уже о том, что внутри него есть res.send .
Кто-нибудь может, пожалуйста, объяснить мне это, пожалуйста? Спасибо за вашу помощь

Ответ №1:

порядок, в котором определяется промежуточное программное обеспечение, имеет значение, когда первое промежуточное программное обеспечение в стеке промежуточного программного обеспечения соответствует пути запроса, оно будет отвечать за обработку запроса.

Я приведу и пример

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

Как вы можете видеть, оба промежуточных программного обеспечения имеют один и тот же путь. первый обработчик запроса в стеке промежуточного программного обеспечения будет выполнен, когда URL запроса будет http://localhost:[port_number]/ , а второй не будет выполнен.

Обычно, когда вы переходите к корневому пути любого веб-сайта на серверной стороне, сервер будет искать файл с именем index.html , который является конфигурацией по умолчанию для многих веб-серверов. Так как каталог, в котором находятся все статические файлы, обслуживаемые express, содержит файл с именем, index.html когда вы переходите к корневому пути вашего приложения Express, которое express.static промежуточное программное обеспечение подключено перед вашим персонализированным промежуточным программным обеспечением, как показано ниже.

 app.use(express.static('public'));

app.use((req,res,next)=>{
    console.log("app.use");
    res.send("hello")
})
  

Вместо index.html файла, который находится внутри public каталога, будет отображаться hello файл.