2017-08-20 2 views
2

Nach einer generierten Vorlage für Express. Im app.js gibt es eineExpress-Middleware-Fehlerhandler

Snippet folgende
app.use('/users', users); 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handler 
app.use(function(err, req, res, next) { 
    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 

    // render the error page 
    res.status(err.status || 500); 
    res.render('error'); 
}); 

Per meinem Verständnis wird die Middleware, um app.use('/users', users)-404-Handler Handler Fehler. Meine Frage ist, wie es möglich sein wird, Fehlerhandler zu erreichen und diese Zeile res.status(err.status || 500); auszuführen? Wird nicht jede fehlgeschlagene Anfrage zuerst durch den 404-Handler geschickt und erhält dafür den Statuscode 404? Bitte lassen Sie mich wissen, wenn ich etwas vermisse! Danke

Antwort

3

Nein, wird es nicht. Wenn Sie an diesen Event-Handler Erklärungen aussehen werden Sie diesen Fehler-Handler für nicht behandelte Fehler angezeigt wird, hat einen zusätzlichen err Parameter:

app.use(function(req, res, next) { 
app.use(function(err, req, res, next) { 

Error-handling middleware always takes four arguments. You must provide four arguments to identify it as an error-handling middleware function. Even if you don’t need to use the next object, you must specify it to maintain the signature. Otherwise, the next object will be interpreted as regular middleware and will fail to handle errors. For details about error-handling middleware.

Also, wenn die Route nicht gefunden wird, die letzte erklärt Middleware ruft Es ist 404 Fehlerhandler. Wenn Sie next mit Fehler aufrufen: next(err) oder Ihr Code löst einen Fehler aus, ruft der letzte Fehlerhandler auf.

1

Wont every failed request be passed through 404 handler first and therefor getting the status code of 404?

Nein, der 404 Route ist nur eine Standard-Middleware und dauert in der Regel verdrahtet, was bedeutet, wenn keine anderen Wege die Anfrage behandelt sie schließlich die

Die 500 ist eine besondere Art von Middleware 404. Hit Sie werden feststellen, dass es 4 Parameter hat (der erste ist ein Fehlerparameter). Diese Middleware wird aufgerufen, sobald Sie next mit einem Fehler oder irgendeiner anderen Art von Daten aufrufen.

Siehe the docs

1

Systemfehler sollte

app.use('/users', users); 

// error handler 
app.use(function(err, req, res, next) { 
    // No routes handled the request and no system error, that means 404 issue. 
    // Forward to next middleware to handle it. 
    if (!err) return next(); 

    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 

    // render the error page 
    res.status(err.status || 500); 
    res.render('error'); 
}); 

// catch 404. 404 should be consider as a default behavior, not a system error. 
app.use(function(req, res, next) { 
    res.status(404); 
    res.render('Not Found'); 
}); 
vor 404 behandelt werden