Обработать ошибку 404 с помощью Express 4

#node.js #express

#node.js #экспресс

Вопрос:

Я использую Express 4, и у меня есть около 50 HTML-страниц. Я пытаюсь обработать ошибки 404, но не могу понять, как. Я не хочу вручную определять все маршрутизаторы внутри узла. Есть ли способ динамического перенаправления на шаблон 404 Jade, если страница не существует?

Я пробовал этот код, но не сработало:

 app.enable('verbose errors');
app.set('port', 3000);

app.use(express.static(__dirname   '/html/'));

var server = http.createServer(app);
server.listen(app.get('port'), function() {
    console.log('ONLINE !');
});

app.use(function(req, res, next) {
    console.log('GET '   req.originalUrl)
    console.log('At %d', Date.now());
    next();
});

// Handle 404
app.use(function(req, res, next) {
    if(req.accepts('html') amp;amp; res.status(404)) {
        res.render('404.jade');
        return;
    }
});
  

Комментарии:

1. Каким образом динамически? Вам нужно будет как-то определить маршрут, будь то с помощью маршрутизатора, app.use , app.error или промежуточного программного обеспечения и т.д.? Все ваши файлы статичны, у вас, похоже, нет никаких маршрутов, кроме статических, и похоже, что все ваши динамические запросы будут попадать в обработчик 404?

2. Да, все они являются статическими. У меня есть несколько запросов get и post, но это для API, который я создаю на стороне. Если я настрою промежуточное программное обеспечение, все запросы заканчиваются ошибками 404.

3. Значит, даже статические файлы попадают в маршрут 404? Вы должны listen после определения маршрутов переместить эту строку в конец

4. Как говорит @adeneo, следуйте порядку в моем ответе. У меня это работает. Спасибо

5. К сожалению, у меня это не сработало. Запросы post и get выполняются нормально, только статические файлы попадают в маршрут 404, если я отправил их, как это сделал @shansfk.

Ответ №1:

У меня это работает:

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

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

app.get('/', function (req, res) {
    res.send('Hello World!');
});

app.get('/employee', function (req, res) {
    res.send('Employee route !!');
});


// Handle 404 - Keep this as a last route
app.use(function(req, res, next) {
    res.status(404);
    res.send('404: File Not Found');
});

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

Структура папок,

введите описание изображения здесь

Теперь, когда мы отправляем запрос следующим образом

http://localhost:3000/sample

Это было обработано промежуточным программным обеспечением.

Обновить

Способ отображения HTML-файлов без записи запроса get — это просто еще одно промежуточное программное обеспечение, подобное этому

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

Добавьте промежуточное программное обеспечение ‘views’ точно после ‘public’.

Теперь, если мы дадим

http://localhost:3000/index.html

Страница отрисована.

Комментарии:

1. Проблема в том, что у меня есть 50 HTML-страниц, я не хочу создавать get-запрос для всех из них. Если только мне не придется.

2. Пожалуйста, проверьте это. Это нормально? Прошу прощения, если я вас неправильно понял. Прошу прощения!

3. Я рад, что это вам помогает. 🙂

4. Это сработало. Но почему статус 400? Это должно быть 404, верно?

5. когда я ввел это в качестве последнего маршрута, я получил ошибку [ERR_HTTP_HEADERS_SENT]: не удается установить заголовки после их отправки клиенту

Ответ №2:

Если вы просто хотите перенаправить, вы можете просто использовать это:

 app.use((req, res) => {
    res.status(404).redirect('/MyHomepage')
});

  

Ответ №3:

Очень просто, вы можете добавить это промежуточное программное обеспечение

 app.use(function (req, res, next) {
  res.status(404).send("Sorry can't find that!")
})