Lassen Sie uns sagen, dass ich diesen Server Route haben (mit Express.js):Wie gehe ich mit allen Fehlern auf meinem Server um, damit es nie abstürzt?
app.get('/cards', function(req, res) {
anUndefinedVariable // Server doesn't crash
dbClient.query('select * from cards', function(err, result) {
anUndefinedVariable // Server crashes
res.send(result.rows)
});
});
Wenn ich einfach eine undefinierte Variable an der Wurzel des Callback /cards
Route verweisen, der Server nicht abstürzt, aber wenn ich darauf verweisen in der verschachtelte Callback stürzt ab.
Liegt das daran, dass Express den Fehler erkennt, wenn es sich auf der Stammebene befindet? Warum fängt es nicht auch die Fehler in den verschachtelten Funktionen auf?
Ich habe versucht, die Fehler wie diese selbst zu kontrollieren:
app.get('/cards', function(req, res) {
try {
dbClient.query('select * from cards', function(err, result) {
anUndefinedVariable
res.send(result.rows)
});
} catch (e) {
console.log('...')
}
});
Aber es geht nie um den Block zu fangen. Vielleicht ist dies der Grund, warum Express den Fehler nicht abfangen kann. Liegt es daran, dass Sie, um einen Fehler abfangen zu können, die Funktion aufrufen müssen, die den Callback aufruft? Z.B. try {functionThatCallsTheQueryCallback() } catch(e) {...}
? Ich glaube nicht, da query
den Callback zu einem bestimmten Zeitpunkt sicher indirekt aufruft.
Wie würde ich alle Fehler erfassen, so dass mein Server niemals abstürzt?
Aber ist nicht der Code innerhalb 'app.get ('/ cards', function (req, res) {...}) 'asynchron? Oder ist es nur asynchron für uns, aber nicht für Express, da Express den Callback aufruft? – maximedupre
Das stimmt. Express ruft Ihren Route-Handler als Reaktion auf ein asynchrones Ereignis auf, ruft es jedoch synchron auf und kann so synchrone Fehler erkennen. Ich glaube, das ist die Quelle: https://github.com/expressjs/express/blob/master/lib/router/layer.js#L86 – andyk