Unten ist das kurze Arbeitsbeispiel mit Handhabung für 3 Arten von Fehlern: 1) übergeben an next()
Handler, 2) throw-ed in Route-Handler, 3) unbehandelter Fehler innerhalb Callback einer Funktion von Route Handler aufgerufen.
(1) und (2) werden mit benutzerdefinierten Fehler Middleware-Handler (A) erfasst und (3) wird von uncaughtException
Handler (B) erfasst.
Express verfügt über einen eigenen Fehlerhandler, der einen Fehler ausgibt, wenn er die Steuerung über die Kette next()
aufruft (d. H. Wenn kein benutzerdefinierter Fehlerhandler vorhanden ist oder das Steuerelement den Befehl weitergibt, next(err, req, res, next)
). Deshalb erhalten Sie immer noch eine Fehlermeldung in der Konsole, selbst wenn der yeyr-Handler keine Trigger ist.
Wenn Sie versuchen, das Beispiel für Fälle (1) und (2) auszuführen, werden die Fehlerausgaben zweimal angezeigt - von benutzerdefiniertem Handler (A) und standardmäßig Express-Fehlerhandler.
'use strict';
var express = require('express');
var app = express();
var server = app.listen(8080, function() {
console.log('* Server listening at ' + server.address().address + ':' + server.address().port);
});
// Example 1: Pass error in route handler to next() handler
app.use('/1', function(req, res, next) {
console.log('* route 1');
next(new Error('* route 1 error'));
});
// Example 2: throw the error in route handler
app.use('/2', function(req, res, next) {
console.log('* route 2');
throw new Error('route 2 error');
});
// Example 3: unhandled error inside some callback function
app.use('/3', function(req, res, next) {
console.log('* route 3');
setTimeout(function(){
throw new Error('route 3 error');
}, 500);
});
// Error handler A: Express Error middleware
app.use(function(err, req, res, next) {
console.log('**************************');
console.log('* [Error middleware]: err:', err);
console.log('**************************');
next(err);
});
// Error handler B: Node's uncaughtException handler
process.on('uncaughtException', function (err) {
console.log('**************************');
console.log('* [process.on(uncaughtException)]: err:', err);
console.log('**************************');
});
Node-Version: v7.2.0
Typischer Fehler ist Fehler-Handler vor Routendefinitionen zu platzieren, sondern nach Ihrer Beschreibung, die nicht der Fall ist.
Um das Problem zu finden, können Sie versuchen, Ihren eigenen Code auf die gleiche Größe wie meins zu reduzieren, und ich denke, das Problem wird offensichtlich.
UPDATE
Außerdem, wenn ich versuche, den Code, den Sie zur Verfügung gestellt (mit trivialen Änderungen) zu laufen, es funktioniert für mich:
'use strict';
var express = require('express');
var app = express();
var server = app.listen(8080, function() {
console.log('* Server listening at ' + server.address().address + ':' + server.address().port);
});
//process.on('uncaughtException', function (err: Error) {
process.on('uncaughtException', function (err) {
try {
console.log('*** uncaughtException:', err);
//mongoDal.log(err.message, err);
} catch (err) {
}
});
//app.get('/test_feature', function (req: Request, res: Response) {
app.get('/test_feature', function (req, res) {
makeError();
res.send("Done");
});
function makeError(){
throw new Error("asdasdad");
}
app.use(logErrors);
//function logErrors (err: Error, req: Request, res: Response, next: NextFunction) {
function logErrors (err, req, res, next) {
console.log('*** logErrors:', err);
//mongoDal.log(err.message, err);
next(err);
}
Das Ergebnis ist (Stack-Traces werden abgeschnitten) :
* Server listening at :::8080
*** logErrors: Error: asdasdad
at makeError (/home/alykoshin/sync/al-projects/dev/nmotw/400-express-error-handling/main-stackoverflow.js:32:9)
...........
Error: asdasdad
at makeError (/home/alykoshin/sync/al-projects/dev/nmotw/400-express-error-handling/main-stackoverflow.js:32:9)
...........
Sie am Anfang der ouput von logErrors
Handler sehen kann und dann t Er gibt den Standard-Express-Fehlerhandler aus.
Wie definieren Sie Ihre Anfragen ?? app.get (req, res) ??? –
@LucasKatayama ja – Alon
Express verfügt bereits über einen Standardfehlerhandler, der wahrscheinlich den Fehler protokolliert. Meine Vermutung ist, dass Sie Ihren Error-Handler an einem Punkt installieren, wo es nicht die allerletzte Middleware ist, aber ich kann nicht sicher sagen, ohne zu wissen, wie Ihre App strukturiert ist (ist 'server.js' der App-Einstiegspunkt, oder Starten Sie die App durch eine andere Datei?) – robertklep