Comment traiter correctement les erreurs dans Express?

je commence à travailler avec Express JS et j'ai rencontré un problème. Je n'arrive pas à trouver la bonne façon de gérer les erreurs.

par exemple, j'ai une API de services web qui sert un objet appelé "event". J'aimerais retourner une chaîne simple de "ne peut pas trouver l'événement" lorsqu'un utilisateur soumet un id d'événement qui n'est pas trouvé. Voici comment je suis en train de structurer mon code:

app.get('/event/:id', function(req, res, next) {
    if (req.params.id != 1) {
        next(new Error('cannot find event ' + req.params.id));
    }

    req.send('event found!');
});

quand je soumets un id autres que 1, les nodules se cassent avec les caractéristiques suivantes: sortie:

http.js:527
   throw new Error("Can't set headers after they are sent.");
         ^
Error: Can't set headers after they are sent.
    at ServerResponse.<anonymous> (http.js:527:11)
    at ServerResponse.setHeader (/usr/local/kayak/node_modules/express/node_modules/connect/lib/patch.js:62:20)
    at /usr/local/kayak/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js:72:19
    at [object Object].<anonymous> (fs.js:107:5)
    at [object Object].emit (events.js:61:17)
    at afterRead (fs.js:878:12)
    at wrapper (fs.js:245:17)

De ce que je peux dire en utilisant le nœud.js debugger, l'exécution du bloc de code se poursuit après next() est appelé, ce qui signifie que req.send('event found!') essaye de courir. Je ne veux pas que cela se produise.

la seule solution que j'ai trouvée est simplement de lancer un new Error() au lieu de" next-ing " it, mais il en résulte une page D'erreur Express HTML générée par défaut. J'aimerais un peu plus de contrôle que cela.

j'ai pris le temps à lire sur le section de gestion des erreurs de la documentation expresse, mais je n'ai pas trouvé le sens.

24
demandé sur nbro 2011-10-10 21:53:00

3 réponses

Vous aurez envie de consulter Traitement Exprès Des Erreurs. À partir de là:

app.param('userId', function(req, res, next, id) {
    User.get(id, function(err, user) {
        if (err) return next(err);
        if (!user) return next(new Error('failed to find user'));
        req.user = user;
        next();
    });
});

La zone de frappe que vous êtes absent est le returnnext(...)

35
répondu Chance 2015-11-14 16:10:47

c'est parce que vous le faites mal: vous avez déjà fait une erreur (qui sera traitée par Express et retournera une page de 500 erreurs pour l'utilisateur ou quelque chose comme ça) mais vous essayez aussi d'envoyer votre propre réponse au client: res.envoyer l'événement trouvé!');

Vous devriez vraiment vérifier le Express guide sur la gestion d'Erreur ici: http://expressjs.com/guide/error-handling.html

ce que je ferais dans votre exemple est:

function NotFound(msg){
  this.name = 'NotFound';
  Error.call(this, msg);
  Error.captureStackTrace(this, arguments.callee);
} 

app.get('/event/:id', function(req, res, next){
  if (req.params.id != 1) {
    throw new NotFound('Cannot find event ' + req.params.id);
  } else {
    res.send('event found!');
  }
});

app.error(function(err, req, res, next){
    if (err instanceof NotFound) {
        res.render('404.ejs');
    } else {
        next(err);
    }
});
19
répondu alessioalex 2017-09-07 09:21:08

Vous avez un couple de problèmes dans ton code:

  • lorsque vous répondez au client, vous devez utiliser le réponse objet (res plutôt que