Подтвердить что ты не робот

Как перенаправить 404 ошибки на страницу в ExpressJS?

Я не знаю функции для этого, кто-нибудь знает об этом?

4b9b3361

Ответ 1

Я нашел этот пример весьма полезным:

https://github.com/visionmedia/express/blob/master/examples/error-pages/index.js

Итак, на самом деле эта часть:

// "app.router" positions our routes
// above the middleware defined below,
// this means that Express will attempt
// to match & call routes _before_ continuing
// on, at which point we assume it a 404 because
// no route has handled the request.

app.use(app.router);

// Since this is the last non-error-handling
// middleware use()d, we assume 404, as nothing else
// responded.

// $ curl http://localhost:3000/notfound
// $ curl http://localhost:3000/notfound -H "Accept: application/json"
// $ curl http://localhost:3000/notfound -H "Accept: text/plain"

app.use(function(req, res, next){
  res.status(404);

  // respond with html page
  if (req.accepts('html')) {
    res.render('404', { url: req.url });
    return;
  }

  // respond with json
  if (req.accepts('json')) {
    res.send({ error: 'Not found' });
    return;
  }

  // default to plain-text. send()
  res.type('txt').send('Not found');
});

Ответ 2

Я думаю, вы должны сначала определить все свои маршруты и как последний маршрут добавить

//The 404 Route (ALWAYS Keep this as the last route)
app.get('*', function(req, res){
  res.send('what???', 404);
});

Пример приложения, которое работает:

app.js:

var express = require('express'),
    app = express.createServer();

app.use(express.static(__dirname + '/public'));

app.get('/', function(req, res){
  res.send('hello world');
});

//The 404 Route (ALWAYS Keep this as the last route)
app.get('*', function(req, res){
  res.send('what???', 404);
});

app.listen(3000, '127.0.0.1');

[email protected]:~/node/stackoverflow/6528876$ mkdir public
[email protected]:~/node/stackoverflow/6528876$ find .
[email protected]:~/node/stackoverflow/6528876$ echo "I don't find a function for that... Anyone knows?" > public/README.txt
[email protected]:~/node/stackoverflow/6528876$ cat public/README.txt 

.
./app.js
./public
./public/README.txt

[email protected]:~/node/stackoverflow/6528876$ curl http://localhost:3000/
hello world
[email protected]:~/node/stackoverflow/6528876$ curl http://localhost:3000/README.txt
I don't find a function for that... Anyone knows?

Ответ 3

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

app.use(function(req,res){
    res.render('404.jade');
});

Ответ 4

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

app.use(function(req, res, next){
    res.status(404).render('404_error_template', {title: "Sorry, page not found"});
});

Поместите этот код в конец всех URL-адресов.

Ответ 5

В последней строке app.js просто поместите эту функцию. Это приведет к переопределению страницы с ошибкой по умолчанию:

app.use(function (req, res) {
    res.render('error');
});

Он будет переопределять все запросы, у которых нет действительного обработчика, и отобразить вашу собственную страницу ошибок.

Ответ 6

Ответ на ваш вопрос:

app.use(function(req, res) {
    res.status(404).end('error');
});

И есть отличная статья о том, почему это лучший способ здесь.

Ответ 8

express-error-handler позволяет указать собственные шаблоны, статические страницы или обработчики ошибок для ваших ошибок. Он также выполняет другие полезные функции обработки ошибок, которые должно выполнять каждое приложение, например, защита от атак DOS с ошибками 4xx и изящное завершение работы при неисправимых ошибках. Вот как вы делаете то, о чем просите:

var errorHandler = require('express-error-handler'),
  handler = errorHandler({
    static: {
      '404': 'path/to/static/404.html'
    }
  });

// After all your routes...
// Pass a 404 into next(err)
app.use( errorHandler.httpError(404) );

// Handle all unhandled errors:
app.use( handler );

Или для пользовательского обработчика:

handler = errorHandler({
  handlers: {
    '404': function err404() {
      // do some custom thing here...
    }
  }
}); 

Или для пользовательского представления:

handler = errorHandler({
  views: {
    '404': '404.jade'
  }
});

Ответ 9

// Add this middleware
// error handler
app.use(function(err, req, res, next) {
 // set locals, only providing error in development
   res.locals.message = err.message;
   res.locals.error = req.app.get('env') === 'development' ? err : {};

 // render the error page
   res.status(err.status || 500);
   res.render('error');
  });

Ответ 10

Хотя приведенные выше ответы верны, для тех, кто хочет получить эту работу в IISNODE, вам также необходимо указать

<configuration>
    <system.webServer>
        <httpErrors existingResponse="PassThrough"/>
    </system.webServer>
<configuration>

в вашем web.config(в противном случае IIS будет есть ваш выход).

Ответ 11

В некоторых случаях, когда 404-страничная страница не может быть записана для исполнения в качестве последнего маршрута, особенно если у вас есть функция асинхронной маршрутизации, которая приводит к позднему оповещению участника/стороне. Приведенная ниже схема может быть принята в этих случаях.

var express = require("express.io"),
    app = express(),
    router = express.Router();

router.get("/hello", function (req, res) {
    res.send("Hello World");
});

// Router is up here.
app.use(router);

app.use(function(req, res) {
    res.send("Crime Scene 404. Do not repeat");
});

router.get("/late", function (req, res) {
    res.send("Its OK to come late");
});

app.listen(8080, function (){
    console.log("Ready");
});

Ответ 12

Если вы используете пакет экспресс-генераторов:

следующая (ERR);

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

Ответ 13

Я использовал обработчик ниже для обработки ошибки 404 со статическим .ejs файлом.

Поместите этот код в маршрут script, а затем запросите file.js через app.use() в app.js/server.js/www.js (если используете IntelliJ для NodeJS)

Вы также можете использовать статический файл .html.

//Unknown route handler
 router.get("[otherRoute]", function(request, response) {
     response.status(404);
     response.render("error404.[ejs]/[html]");
     response.end();
 });

Таким образом, работающий экспресс-сервер будет отвечать соответствующим 404 error, и ваш сайт также может включать страницу, которая правильно отображает ответ сервера 404 должным образом. Вы также можете включить navbar в 404 error template, который ссылается на другой важный контент вашего сайта.

Ответ 14

app.get('*',function(req,res){
 res.redirect('/login');
});

Ответ 15

вы можете обрабатывать ошибки в соответствии с типом содержимого

Кроме того, обработка выполняется в соответствии со статусом.

app.js

import express from 'express';

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// when status is 404, error handler
app.use(function(err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    if( 404 === err.status  ){
        res.format({
            'text/plain': () => {
                res.send({message: 'not found Data'});
            },
            'text/html': () => {
                res.render('404.jade');
            },
            'application/json': () => {
                res.send({message: 'not found Data'});
            },
            'default': () => {
                res.status(406).send('Not Acceptable');
            }
        })
    }

    // when status is 500, error handler
    if(500 === err.status) {
        return res.send({message: 'error occur'});
    }
});

404.jade

doctype html

html
  head
    title 404 Not Found

    meta(http-equiv="Content-Type" content="text/html; charset=utf-8")
    meta(name = "viewport" content="width=device-width, initial-scale=1.0 user-scalable=no")

  body
      h2 Not Found Page
      h2 404 Error Code

Если вы можете использовать res.format, вы можете написать простой код обработки ошибок.

Рекомендация res.format() вместо res.accepts().

Если ошибка 500 возникает в предыдущем коде, if(500 == err.status){. . . } вызывается

Ответ 16

Для отправки на пользовательскую страницу:

app.get('*', function(req, res){
  if (req.accepts('html')) {
     res.send('404', '<script>location.href = "/the-404-page.html";</script>');
     return;
  }
});