Question Express js gestion des erreurs


J'essaie de faire fonctionner la gestion des erreurs avec express mais au lieu de voir une réponse "erreur !!!" comme je pense que je vois "une exception" sur la console, puis le processus est tué. Est-ce ainsi que la gestion des erreurs est supposée être configurée et, dans l'affirmative, existe-t-il un autre moyen de détecter les erreurs?

var express = require('express');
var app = express();

app.use(function(err, req, res, next) {
    console.log("error!!!");
    res.send("error!!!");
});

app.get('/', function(request, response) {
    throw "some exception";
    response.send('Hello World!');
});

app.listen(5000, function() {
  console.log("Listening on 5000");
});

18
2018-03-28 14:13


origine


Réponses:


Un exemple d’app / guide sur la gestion des erreurs est disponible sur https://expressjs.com/fr/guide/error-handling.html Cependant, vous devriez corriger votre code:

// Require Dependencies
var express = require('express');
var app = express();

// Middleware
app.use(app.router); // you need this line so the .get etc. routes are run and if an error within, then the error is parsed to the next middleware (your error reporter)
app.use(function(err, req, res, next) {
    if(!err) return next(); // you also need this line
    console.log("error!!!");
    res.send("error!!!");
});

// Routes
app.get('/', function(request, response) {
    throw "some exception";
    response.send('Hello World!');
});

// Listen
app.listen(5000, function() {
  console.log("Listening on 5000");
});

23
2018-03-28 15:38



Quelques conseils:

1) Votre code ne fonctionnait pas car votre middleware de gestionnaire d'erreurs était exécuté avant que votre itinéraire ne soit atteint. Le gestionnaire d'erreurs n'a donc jamais eu la chance de recevoir l'erreur. Ce style est connu sous le nom de continuation de passage. Mettez votre gestionnaire d'erreur en dernier dans la pile de middleware.

2) Vous devez arrêter le serveur lorsque vous rencontrez une erreur non gérée. La meilleure façon de faire est d'appeler server.close(), où serveur est le résultat de faire var server = http.createServer(app);

Ce qui signifie que vous devriez faire quelque chose comme ceci:

var server = http.createServer(app);

app.use(function(err, req, res, next) {
  console.log("error!!!");
  res.send("error!!!");
  server.close();
});

Vous devriez probablement aussi expirer le server.close (), au cas où il ne pourrait pas se terminer (votre application est dans un état indéfini, après tout):

var server = http.createServer(app);

app.use(function(err, req, res, next) {
  console.log("error!!!");
  res.send("error!!!");

  server.close();

  setTimeout(function () {
    process.exit(1);
  }, 3*1000);
});

J'ai créé une bibliothèque qui fait tout cela pour vous et vous permet de définir des réponses personnalisées, y compris des vues d'erreur spécialisées, des fichiers statiques à servir, etc.:

https://github.com/ericelliott/express-error-handler


7
2017-10-17 07:06



J'ai eu le même problème et je n'ai pas compris ce qui n'allait pas. La chose est que si vous avez défini le paramètre errorHandler express, votre gestionnaire d'erreur personnalisé n'est jamais appelé. Si vous avez le code suivant, retirez-le simplement:

if ('development' === app.get('env')) {
  app.use(express.errorHandler());
}

Travaillé pour moi :)


2
2018-02-18 12:57



Installer express install connect-domain, puis quelque chose comme ceci:

var express = require("express"),  
    connectDomain = require("connect-domain"),
    app = express(),
    errorHandler;

// Notre gestionnaire d'erreurs

app.use(connectDomain());  
    errorHandler = function (err, req, res, next) {  
        res.send(500, {
           "status": "error",
           "message": err.message
        });
    console.log(err);
};

Ensuite, lors de la configuration de vos points de terminaison, corrigez errorHandler à la fin dans un use ():

app.get("/some/data", function (req, res) {  
    // ... do some stuff ...
    res.send(200, "Yay! Happy Success!");
}).use(errorHandler);

1
2018-04-25 08:08