2016-03-20 7 views
0

Ich habe eine node.js + Express + Express-Lenker-App. Ich möchte die Benutzer auf 404-Seite umleiten, wenn sie zu einer Seite gehen, die nicht existiert, und sie auf eine 500 umleiten, wenn es einen internen Serverfehler oder eine Ausnahme gibt (ohne den Server anzuhalten). In meiner app.js habe ich am Ende die Middleware geschrieben, um diese Aufgaben zu erledigen.Handhabung 404, 500 und Ausnahmen in Node.js und Express

app.get('*', function(req, res, next) { 
    var err = new Error(); 
    err.status = 404; 
    next(); 
}); 

//Handle 404 
app.use(function(err, req, res, next){ 
    res.sendStatus(404); 
    res.render('404'); 
    return; 
}); 

//Handle 500 
app.use(function(err, req, res, next){ 
    res.sendStatus(500); 
    res.render('500'); 
}); 

//send the user to 500 page without shutting down the server 
process.on('uncaughtException', function (err) { 
    console.log('-------------------------- Caught exception: ' + err); 
    app.use(function(err, req, res, next){ 
     res.render('500'); 
    }); 
}); 

Allerdings funktioniert nur der Code für 404. Also, wenn ich versuche, zu einer URL zu gehen

es leitet mich erfolgreich auf meine 404-Seite. Der 505 funktioniert nicht. Und für die Ausnahmebehandlung läuft der Server weiter, aber er leitet mich nicht zur 500-Fehler-Seite nach der console.log

Ich bin verwirrt von so vielen Lösungen online, wo Menschen verschiedene Techniken dafür zu implementieren scheinen.

Hier sind einige der Ressourcen, die ich bei

http://www.hacksparrow.com/express-js-custom-error-pages-404-and-500.html

Correct way to handle 404 and 500 errors in express

How to redirect 404 errors to a page in ExpressJS?

https://github.com/expressjs/express/blob/master/examples/error-pages/index.js

Antwort

4

Der Prozess auf uncaughtexception für das Bewerbungsverfahren ist aussah - kein pro Fehlerbehandler anfordern Beachten Sie, dass es einen Fehler in seinem Callback braucht und res nicht übergeben wird. Es ist ein globaler Anwendungsausnahmebehandler. Es ist gut, wenn der globale Code ausgelöst wird.

Eine Option ist, dass Sie alle Ihre normalen Routen haben können (nicht in Ihrem Beispiel sehen), dann eine nicht-Fehler-Handler final * Route für 404. Das ist immer die letzte Route bedeutet, dass es durch alle anderen Routen nicht gefallen ist eine Übereinstimmung finden ... also nicht gefunden. Es handelt sich nicht um eine Ausnahmebehandlung - Sie wissen genau, dass der von Ihnen angeforderte Pfad keine Übereinstimmung aufweist, da er durchgefallen ist.

How to redirect 404 errors to a page in ExpressJS?

Dann kann die err Route 500

http://expressjs.com/en/guide/error-handling.html

Rückkehr

Das Problem zwei Fehler Routen werden Sie haben, so dass es die erste trifft immer die harte Codes ein 404.

Rückkehr

Das Express 4-Werkzeug erstellt dieses Muster:

var users = require('./routes/users'); 

// here's the normal routes. Matches in order 
app.use('/', routes); 
app.use('/users', users); 

// catch 404 and forward to error handler 
// note this is after all good routes and is not an error handler 
// to get a 404, it has to fall through to this route - no error involved 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handlers - these take err object. 
// these are per request error handlers. They have two so in dev 
// you get a full stack trace. In prod, first is never setup 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function(err, req, res, next) { 
     res.status(err.status || 500); 
     res.render('error', { 
      message: err.message, 
      error: err 
     }); 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: {} 
    }); 
}); 
+0

var profile = require ('./ routes/profile); app.use ('/ profie', Profil); Auf diese Weise definiere ich alle meine Routen. – codeinprogress

+0

Das ist in Ordnung - diese Routen sollten vor der 404-Route und den Fehlerrouten eingerichtet werden - im Wesentlichen, wo die Routen von/und/users oben eingerichtet sind. Die Reihenfolge der Routen ist entscheidend – bryanmac

+0

Das ist genau das, was das obige Beispiel macht. Es lädt Benutzerfunktionen, indem es Benutzer erfordert und richtet/Benutzer route ein, indem es Benutzer übergibt. * Dann * fügt es die 404-Wildcard-Route nach dem Einrichten aller Routen, dann endlich den Fehler 500 Route – bryanmac