2013-03-28 17 views
18

Ich versuche Fehlerbehandlung mit Express zu bekommen, aber anstatt eine Antwort von "Fehler !!!" wie ich erwarte ich sehe "einige Ausnahmen" auf der Konsole und dann wird der Prozess getötet. Soll die Fehlerübergabe eingerichtet werden und gibt es dann einen anderen Weg, Fehler zu finden?Express js Fehlerbehandlung

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"); 
}); 

Antwort

23

Ein Beispiel app/Anleitung zur Fehlerbehandlung ist jedoch bei https://expressjs.com/en/guide/error-handling.html verfügbar sollten Sie den Code beheben:

// 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"); 
}); 
+8

Für Menschen aus der Zukunft ist app.router für die 3.x => 4.x Migration veraltet; siehe https://github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x. –

7

Ein paar Tipps:

1) Ihr Code nicht funktioniert Da Ihre Fehlerbehandler-Middleware vor dem Erreichen Ihrer Route ausgeführt wurde, hatte der Fehlerhandler nie die Möglichkeit, dass der Fehler an ihn weitergegeben wurde. Dieser Stil wird als Fortsetzungsübergabe bezeichnet. Setzen Sie Ihren Error-Handler zuletzt in den Middleware-Stack.

2) Sie sollten den Server herunterfahren, wenn Sie einen unbehandelten Fehler haben. Der beste Weg, dies zu tun ist server.close() zu nennen, in dem Server ist das Ergebnis der var server = http.createServer(app);

tun, was bedeutet, sollten Sie etwas tun:

var server = http.createServer(app); 

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

Sie sollten wahrscheinlich auch Zeit, um die server.close(), falls es kann nicht abgeschlossen werden (die App ist in einem undefinierten Zustand, nachdem alle):

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); 
}); 

ich eine Bibliothek gemacht, dass all dies für Sie tut, und lässt definieren Sie benutzerdefinierte Antworten, einschließlich spezialisierter Fehleransichten, statische Dateien zu bedienen, etc ...:

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

+1

"Sie sollten den Server herunterfahren"? Warum? Nein! Du solltest nicht! – fiatjaf

+0

Wenn Sie einen unbehandelten Fehler haben, sollten Sie den Server unbedingt herunterfahren, da der Fehler die App möglicherweise in einem undefinierten Zustand zurücklassen kann - was bedeutet, dass Dinge schief laufen könnten. Das Herunterfahren gibt der App die Chance, sich selbst zu reparieren, indem sie wieder in einen stabilen Zustand übergeht. –

+0

Wenn also jemand eine unbehandelte Ausnahme ausgelöst hat, ist die ganze App für alle nicht verfügbar?das ist dumm – astroanu

2

hatte ich das gleiche Problem und kann nicht herausfinden, was falsch war. Die Sache ist, wenn Sie den express errorHandler definiert haben, dann wird Ihr benutzerdefinierter Fehlerhandler nie aufgerufen. Wenn Sie den nächsten Code haben, entfernen Sie einfach es:

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

für mich gearbeitet :)

+0

Ich würde vorschlagen, 3 '=' zu verwenden, so dass es auch nur für guten Habbit checks gibt :) –

1

express Installation installieren connect-Domäne, dann etwa so:

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

// Unsere Error Handler

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

Dann, beim Einrichten Ihrer Endpunkte, tack errorHan dler am Ende in einer Verwendung():

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