Почему маршрутизация, определенная после app.use, ничего не возвращает после получения запросов? - PullRequest
0 голосов
/ 23 июня 2019

Я новичок в node.js и express.js и практикую основы создания сервера.Я обнаружил, что если я пишу app.get после app.use, то этот код просто не работает.

Я пытался найти различные комбинации «почему app.use express.js 404», но ничего не нашел.

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


// 1) Add a route that answers to all request types
app.route('/article')
.get(function(req, res) {
    res.send('Get the article');
})
.post(function(req, res) {
    res.send('Add an article');
})
.put(function(req, res) {
    res.send('Update the article');
});
// on the request to root (localhost:3000/)
app.get('/', function (req, res) {
    res.send('<b>My</b> first express http server');
});


// 3) Use regular expressions in routes
// responds to : batmobile, batwing, batcave, batarang
app.get(/bat/, function(req, res) {
    res.send('/bat/');
});


// 2) Use a wildcard for a route
// answers to : theANYman, thebatman, thesuperman
app.get('/the*man', function(req, res) {
    res.send('the*man');
});
// app.get does NOT return anything thats defined beyond this method call
app.use(function(req, res, next) {
    res.status(404).send("Sorry, that route doesn't exist. Have a nice day :)");
});
// this will not be work unless moved above app.use
app.get('/welcome', function (req, res) {
    res.send('<b>Hello</b> welcome to my http server made with express');
});

app.listen(3000, function () {
    console.log('Example app listening on port 3000.');
});

1 Ответ

1 голос
/ 23 июня 2019

Обработчики маршрутов проверяются на соответствие пути в том порядке, в котором они были определены.

Как только вы определите это:

app.use(function(req, res, next) {
    res.status(404).send("Sorry, that route doesn't exist. Have a nice day :)");
});

Ответ был отправлен, а next() не был вызван, поэтому больше не будут вызываться обработчики маршрута в цепочке.

Ваш обработчик маршрута 404 должен быть последним определенным обработчиком маршрута. Идея состоит в том, что если никакой другой обработчик маршрута не обработал этот запрос, то у вас его не должно быть, и это должен быть маршрут, для которого вы должны вернуть 404. Но вы можете знать, что никакой другой обработчик маршрута не обработает этот запрос, если вы поместите этот последний в цепочку (и, таким образом, определите его последним, чтобы он был последним в цепочке).


Чтобы объяснить немного больше, каждый раз, когда вы делаете app.use(), app.post() или app.get() или любой другой в этом семействе, он добавляет обработчик маршрута во внутренний массив маршрутизации и добавляет их в этот массив в чтобы код работал. Первый маршрут для регистрации идет в начале массива, последний в конце массива.

Когда поступает запрос, Express запускается с начала этого массива и ищет первый обработчик, который соответствует пути и типу входящего запроса, и вызывает этот обработчик маршрута.

Если этот обработчик маршрута никогда не вызывает next(), то для этого запроса больше не будут вызываться обработчики маршрута. Это сделано. Если этот обработчик маршрута вызывает next(), то Express продолжает поиск в массиве следующего подходящего обработчика маршрута.

Итак, вы можете видеть, что ваш обработчик app.use() 404 никогда не вызывает next(), поэтому Express никогда не будет искать более подходящие обработчики маршрутов для этого запроса и, следовательно, обработчики маршрутов, объявленные после этого, никогда не будут найдены и никогда называется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...