2017-07-28 2 views
1

Also, das Triviale. Alles, was wir wissen, dass Express verfügt über eine integrierte in Handler Standardfehler, der vier Argumente erwarten (err, erf, res, nächste) zu handhaben „synchrone Ausnahmen“ wie Reference, Typeerror, etc:Wie genau behandelt Express.js Fehler?

UPDATE: diese Frage Express , nicht darüber, wie unbehandelte Ausnahmen/etc. Ich möchte wissen, wie im ersten Codeblock Express benutzerdefinierte Ausnahme behandeln kann. Zweites Beispiel mit Async. Ausnahme gehört nicht direkt zu dieser Frage.

const express = require('express')(); 

express.all('*', (req, res) => { 
    throw new Error('my own error'); 
    res 
    .send('okay?'); 
}); 

express.use((err, req, res, next) => { 
    console.error(err.stack); 
    res 
    .status(503) 
    .send('Express is still up and running'); 
}).listen(3000); 

Aber nicht dies:

const express = require('express')(); 

express.all('*', (req, res) => { 
    process.nextTick(() => { 
    throw new Error('my own error'); 
    }); 
    res 
    .send('okay?'); 
}); 

express.use((err, req, res, next) => { 
    console.error(err.stack); 
    res 
    .status(503) 
    .send('Won\'t be executed'); 
}).listen(3000); 

Aber ich bin über die Realisierung dieses Handler neugierig.

Ich kann nichts wie

process.on('uncaughtException'... oder Domänen/Promises/cluster finden.

Vielleicht vermisse ich etwas.

Kann jemand klären?

Antwort

1

Es gibt eine catch-all kind of block in Express's router, die ausgeführt wird:

try { 
    fn(req, res, next); 
} catch (err) { 
    next(err); 
} 

So in diesem Block alle Ausnahmen sind gefangen und übersetzt next() Funktionsaufrufe mit Fehlerparametersatz die Ausnahme entsprechen.

Genauer gesagt, wenn eine Anfrage zum Ausdruck kommt:

  • app.handle() genannt wird, die dann Router bestimmt und ruft router.handle()
  • router.handle() Prozesse durch die Schichten und schließlich entspricht Ihr Handler mit express.all('*', ...) Unterschrift registriert
  • handle_request (im internen Layer-Modul des Routers) ruft Ihre Handler-Funktion auf, wie im obigen try-catch-Block angegeben. Dadurch werden alle möglichen Ausnahmen erfasst und in n übersetzt ext Anrufe.
+1

Danke für ausführliche Antwort. Ich habe meinen eigenen 'Express' gemacht, um dieses Verhalten zu reproduzieren. Sehr einfache und elegante Handhabung wie für mich. – loadaverage