2016-04-13 3 views
0

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?

Antwort

1

try...catch fängt nur Fehler ab, die bei synchronen Operationen auftreten. Es wird keine Fehler erkennen, die bei Callbacks für asynchrone Vorgänge auftreten, wie Sie es in Ihrem zweiten Beispiel oben getan haben.

Wie im ersten Beispiel behandelt express Fehler, die synchron ausgelöst werden, und sendet eine 500-Antwort an den Client.

Sie können in domains nach Fehler bei asynchronen Operationen suchen. Aber seien Sie sich bewusst, dass sie noch ausständig sind. Es lohnt sich, die Warnungen in den Dokumenten darüber zu lesen, warum sie veraltet sind.

+0

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

+1

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

0

Es kann in Knoten durchgeführt, obwohl in der Regel nicht zu empfehlen, durch die Knoten lassen das uncaughtException Ereignis zu behandeln, https://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception

process.on('uncaughtException', (err) => { 
    console.log(`Caught exception: ${err}`); 
}); 

Ein weiterer bevorzugter Ansatz gerade sein lassen würde es vernichten, und hat es automatisch danach neu gestartet . Dafür gibt es einige Tools, wie zum Beispiel nodemon, pm2, forever ...