225 votes

Comment rediriger les erreurs 404 vers une page en ExpressJS ?

Je ne connais pas de fonction pour faire cela, quelqu'un en connaît-il une ?

302voto

Felix Points 1186

J'ai trouvé cet exemple très utile :

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

Donc, c'est en fait cette partie :

// "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.json({ error: 'Not found' });
    return;
  }

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

0 votes

Veuillez définir le terme "manipulé". Qu'est-ce qui caractérise exactement la route comme étant manipulée ?

2 votes

Je suppose qu'aucune route correspondante n'a été trouvée jusqu'à ce moment-là.

4 votes

Pour votre information, l'utilisation de app.router est maintenant déprécié. Voir github.com/strongloop/express/wiki/

193voto

Alfred Points 32190

Je pense que vous devriez d'abord définir toutes vos routes et comme dernière route ajouter

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

Un exemple d'application qui fonctionne :

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?

6 votes

Eh bien... le problème est que le "*" correspond déjà aux fichiers .js et .css, et qu'ils ne sont pas spécifiés dans l'application... eh bien, je ne sais pas s'il existe un moyen d'attraper exactement la même chose que l'erreur 404, ou un moyen d'écraser le message "Cannot get...". Quoi qu'il en soit, je vous remercie

1 votes

Utilisez-vous un intergiciel statique, car vous pouvez alors toujours servir des fichiers statiques ?

4 votes

app.get('/public/*', function(req, res){ res.sendfile(__dirname + '/public/' + req.url); }) vous pouvez utiliser cette route pour envoyer des fichiers statiques. cela fonctionne bien avec la route "*" ci-dessus. app.use(express.static(__dirname + '/public')); ne fonctionne pas pour moi, câblé.

45voto

Ganesh Kumar Points 480

Vous pouvez placer un middleware à la dernière position qui lance un NotFound erreur,
ou même rendre la page 404 directement :

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

11 votes

Veuillez envisager une réponse un peu plus verbeuse la prochaine fois... Les exemples sont généralement bien - et celui-ci est un bon exemple - mais une explication peut être très, très bien aussi...

2 votes

+1 Très bien ! Je pense que c'est mieux qu'une dernière route, parce que de cette façon tu n'as pas à use() votre app.router au dernier moment. (comme dans mon cas)

0 votes

En outre, cela remplace le comportement par défaut sur tout demande (pas seulement GET s). Essayez de POST une URL aléatoire avec l'autre méthode ; elle renverra l'URL par défaut. Cannot POST... . Un attaquant saurait alors que vous utilisez Express.JS.

34voto

Sushant Gupta Points 2029

Les réponses ci-dessus sont bonnes, mais dans la moitié d'entre elles, vous n'obtiendrez pas 404 comme code d'état HTTP retourné et dans l'autre moitié, vous ne serez pas en mesure d'avoir un rendu de modèle personnalisé. La meilleure façon d'avoir une page d'erreur personnalisée (404) dans Expressjs est la suivante

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

Placez ce code à la fin de tous vos mappages d'URL.

0 votes

@SushantGupta - Que voulez-vous dire par "mappages d'URL existentiels valides" ?

0 votes

@JonathanBechtel Comme dans avoir le bloc de code ci-dessus après vos routes URL non erronées.

3voto

Lalith Points 3372

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X