web-dev-qa-db-fra.com

Comment puis-je obtenir Express.js à 404 uniquement sur les itinéraires manquants?

Pour le moment, voici ce qui se trouve en dessous de tous mes autres itinéraires:

app.get('*', function(req, res){
  console.log('404ing');
  res.render('404');
});

Et selon les journaux, il est déclenché même lorsque la route est mise en correspondance ci-dessus. Comment puis-je l'obtenir uniquement lorsque rien ne correspond?

31
Hoa

Vous avez juste besoin de le mettre à la fin de tout itinéraire.

Jetez un coup d’œil au deuxième exemple de Passing Route Control :

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

var users = [{ name: 'tj' }];

app.all('/user/:id/:op?', function(req, res, next){
  req.user = users[req.params.id];
  if (req.user) {
    next();
  } else {
    next(new Error('cannot find user ' + req.params.id));
  }
});

app.get('/user/:id', function(req, res){
  res.send('viewing ' + req.user.name);
});

app.get('/user/:id/edit', function(req, res){
  res.send('editing ' + req.user.name);
});

app.put('/user/:id', function(req, res){
  res.send('updating ' + req.user.name);
});

app.get('*', function(req, res){
  res.send('what???', 404);
});

app.listen(3000); 

Sinon, vous ne pouvez rien faire car tous les itinéraires qui ne correspondent pas produiront un 404. Vous pouvez ensuite utiliser ce code pour afficher le bon modèle:

app.error(function(err, req, res, next){
    if (err instanceof NotFound) {
        res.render('404.jade');
    } else {
        next(err);
    }
});

C'est documenté dans Error Handling .

40
Charles

Je parie que votre navigateur répond à une demande pour le favicon. C'est pourquoi vous voyez le 404 dans vos journaux après le succès de 200 pour la page demandée.

Configurez un itinéraire favicon.

7
Justin Cloud

Je voulais un piège qui rendrait ma page 404 uniquement sur les routes manquantes et je l'ai trouvé ici dans la documentation sur la gestion des erreurs https://expressjs.com/fr/guide/error-handling.html

app.use(function (err, req, res, next) {
  console.error(err.stack)
  res.status(404).render('404.ejs')
})

Cela a fonctionné pour moi.

1
kiko carisse

J'espère que ça m'aide, j'ai utilisé ce code en bas des routes

router.use((req, res, next) => {
    next({
        status: 404,
        message: 'Not Found',
    });
});

router.use((err, req, res, next) => {
    if (err.status === 404) {
        return res.status(400).render('404');
    }

    if (err.status === 500) {
        return res.status(500).render('500');
}

next();

});

0
Vinh Thai