Узел не перенаправляет на страницу не найден 404 - PullRequest
0 голосов
/ 01 июля 2019

Если я перейду к http://localhost:4000/asdfasd, я должен увидеть, что моя страница не найдена, и мой console.log на сервере, но я не вижу ни того, ни другого.

APP.JS

const EXPRESS = require('express');
const BODY_PARSER = require('body-parser');
const PATH = require('path');

const APP = EXPRESS();

const ADMIN_ROUTES = require('./routes/admin');
const SHOP_ROUTES = require('./routes/shop');

APP.use(BODY_PARSER.urlencoded({ extended: false }));

APP.use('/admin', ADMIN_ROUTES);
APP.use(SHOP_ROUTES);

APP.use((req, res, next) => {
  console.log('page not found');
  res
    .status(404)
    .sendFile(PATH.join(__dirname, '../', 'views', 'not-found.html'));
});

APP.listen(4000);

1 Ответ

1 голос
/ 02 июля 2019

Пример кода


Экспресс не отправляет not-found.html, потому что что-то выше в вашем конвейере обрабатывает ваш запрос GET на /asdfasd.

В вашей ситуации APP.use(SHOP_ROUTES) обрабатывает ваш запрос, потому что все запросы, кроме тех, которые начинаются с /admin, сначала отправляются на SHOP_ROUTES.

Вот несколько случаев, демонстрирующих, почему вы не видите not-found.html:


Случай 1: Вы используете router.use() в своем магазинемаршрутизатор и он обрабатывает запрос.

В этом примере:

/ route / shop.js

router.use((req, res, next) => res.send('Something'))

В запросе к /asdfasd отобразится слово «Нечто» на странице.Express не пойдет дальше по конвейеру, потому что запрос уже обработан.


Случай 2: У вас есть асинхронная функция внутри маршрутизатора вашего магазина, которая не использует next().

Например, если вы звоните по какому-либо API:

/ route / shop.js

// request-promise is an HTTP request client that returns a promise
const rp = require('request-promise')

router.use((req, res, next) => {
    rp.get('https://myapi.com/users')
        .then(response => res.json(response))
        .catch()
})

иваш запрос API возвращает код состояния 400+ или 500+, ваш запрос по существу застрял внутри этого router.use(), потому что вы не указали Express, как обрабатывать неправильные запросы.

Вы должны будете использовать next выполняет функцию обратного вызова внутри вашего .catch():

router.use((req, res, next) => {
    rp.get('https://myapi.com/users')
        .then(response => res.json(response))
        .catch(next)
})

Случай 3: У вас есть динамический маршрут внутри вашего роутера магазина, напр./:word.

Если в вашем SHOP_ROUTES, у вас есть динамический маршрут, как показано ниже:

/ route / shop.js

router.get('/:word', (req, res, next) => res.send(req.params.word))

Любой запрос к /, который еще не был обработан предыдущим маршрутом, будет обрабатываться этим.

...