Как перенаправить 404 ошибки на страницу в ExpressJS? - PullRequest
186 голосов
/ 30 июня 2011

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

Ответы [ 19 ]

256 голосов
/ 21 марта 2012

Мне показался этот пример весьма полезным:

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's 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');
});
139 голосов
/ 30 июня 2011

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

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

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

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');

alfred@alfred-laptop:~/node/stackoverflow/6528876$ mkdir public
alfred@alfred-laptop:~/node/stackoverflow/6528876$ find .
alfred@alfred-laptop:~/node/stackoverflow/6528876$ echo "I don't find a function for that... Anyone knows?" > public/README.txt
alfred@alfred-laptop:~/node/stackoverflow/6528876$ cat public/README.txt 

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

alfred@alfred-laptop:~/node/stackoverflow/6528876$ curl http://localhost:3000/
hello world
alfred@alfred-laptop:~/node/stackoverflow/6528876$ curl http://localhost:3000/README.txt
I don't find a function for that... Anyone knows?
31 голосов
/ 03 июля 2011

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

app.use(function(req,res){
    res.status(404).render('404.jade');
});
31 голосов
/ 15 мая 2013

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

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

. Поместите этот код в конец всех ваших отображений URL.

4 голосов
/ 05 марта 2013

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

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

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

4 голосов
/ 08 июля 2013

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

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

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

3 голосов
/ 13 апреля 2016

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

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");
});
3 голосов
/ 30 июня 2011

https://github.com/robrighter/node-boilerplate/blob/master/templates/app/server.js

Это то, что делает узел-шаблон.

3 голосов
/ 21 октября 2013

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'
  }
});
2 голосов
/ 13 августа 2018

Самый простой способ сделать это - поймать все на странице ошибок.

// Step 1: calling express
const express = require("express");
const app = express();

Затем

// require Path to get file locations
const path = require("path");

Теперь вы можете хранить все свои html-страницы (включаястраница ошибки "html") в переменной

// Storing file locations in a variable
var indexPg = path.join(__dirname, "./htmlPages/index.html");
var aboutPg = path.join(__dirname, "./htmlPages/about.html");
var contactPg = path.join(__dirname, "./htmlPages/contact.html");
var errorPg = path.join(__dirname, "./htmlPages/404.html"); //this is your error page

Теперь вы просто вызываете страницы с помощью метода Get и получаете все для всех маршрутов, недоступных для перенаправления на страницу ошибки с помощью app.get ("* ")

//Step 2: Defining Routes
//default page will be your index.html
app.get("/", function(req,res){
  res.sendFile(indexPg);
});
//about page
app.get("/about", function(req,res){
  res.sendFile(aboutPg);
});
//contact page
app.get("/contact", function(req,res){
  res.sendFile(contactPg);
});
//catch all endpoint will be Error Page
app.get("*", function(req,res){
  res.sendFile(errorPg);
});

Не забудьте настроить порт и прослушивать сервер:

// Setting port to listen on
const port = process.env.PORT || 8000;
// Listening on port
app.listen(port, function(){
  console.log(`http://localhost:${port}`);
})

Теперь должна отображаться страница с ошибкой для всех нераспознанных конечных точек!

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