web-dev-qa-db-fra.com

Node.js / Express - Erreur de rendu lorsque la page est introuvable

J'ai la définition de contrôleur/route suivante dans Node.js (en utilisant Express et Mongoose). Quelle serait la manière la plus légère et la plus appropriée de gérer l'erreur lorsque l'utilisateur demande une page qui n'existe pas?

  app.get('/page/:pagetitle', function(req, res) {
      Page.findOne({ title: req.params.pagetitle}, function(error, page) {
          res.render('pages/page_show.ejs',
            { locals: {
                title: 'ClrTouch | ' + page.title,
                page:page
            }
          });
      });
  });

Il casse actuellement mon application. Je crois que parce que je ne fais rien avec l'erreur, je le passe juste à la vue comme un succès?

TypeError: Cannot read property 'title' of null

Merci beaucoup.

26
tuddy

Consultez l'exemple express pages d'erreur . Le principe consiste à enregistrer d'abord les itinéraires de votre application, puis vous enregistrez un gestionnaire catch all 404 pour toutes les autres demandes qui ne correspondent pas à un itinéraire. Enfin, un gestionnaire 500 est enregistré, comme suit:

// "app.router" positions our routes 
// specifically above the middleware
// assigned below

app.use(app.router);

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

app.use(function(req, res, next){
  // the status option, or res.statusCode = 404
  // are equivalent, however with the option we
  // get the "status" local available as well
  res.render('404', { status: 404, url: req.url });
});

// error-handling middleware, take the same form
// as regular middleware, however they require an
// arity of 4, aka the signature (err, req, res, next).
// when connect has an error, it will invoke ONLY error-handling
// middleware.

// If we were to next() here any remaining non-error-handling
// middleware would then be executed, or if we next(err) to
// continue passing the error, only error-handling middleware
// would remain being executed, however here
// we simply respond with an error page.


app.use(function(err, req, res, next){
  // we may use properties of the error object
  // here and next(err) appropriately, or if
  // we possibly recovered from the error, simply next().
  res.render('500', {
      status: err.status || 500
    , error: err
  });
});
48
blockchaindev

L'un des problèmes majeurs avec Node.JS est qu'il n'y a pas de capture d'erreur propre. La manière conventionnelle est généralement pour chaque fonction de rappel, le premier argument est le non nul s'il y a une erreur, donc par exemple:

function( error, page ){
   if( error != null ){
       showErrorPage( error, req, res );
       return;
   }
   ...Page exists...
}

Les choses peuvent mal tourner au bout d'un certain temps avec trop de rappels, et je recommande d'utiliser quelque chose comme async , de sorte que s'il y a une erreur, il passe directement à un rappel d'erreur.

EDIT: Vous pouvez également utiliser gestion express des erreurs .

3
Nican