2013-10-30 4 views
10

Ist es möglich, jede Anfrage über express.js in eine domain oder trycatchsee trycatch info here zu verpacken?Wie kann ich jede Express-JS-Anfrage in eine Domain oder einen TryCatch einbinden

Ich versuche, eine "Fang alle" Arten (die Express-Fehler-Handler-Middleware fängt keine Async-Aufrufe), um sicher zu sein, dass alle Fehler, die ich vermisse, mit 500 an den Benutzer gesendet werden.

Wenn Sie einen asynchronen Funktionsaufruf haben (z. B. process.nextTick()), liegt er außerhalb des Bereichs von express 'error handler, wodurch der Prozess vollständig abgebrochen wird. Daher wird die Verwendung des Express-Fehlerhandlers nicht in allen Fällen funktionieren.

Antwort

8

Express haben bereits eine Fehlerbehandlung implementiert. Es erbt es von connect. Um es zu verwenden, müssen Sie es als letzten Middlewarepunkt hinzufügen (letzter Aufruf app.use (...)). Zum Beispiel:

var express = require('express') 
    , app = express(); 

app.use(app.router); 
app.use(express.errorHandler()); 

// app.get(...), app.post(...), app.listen(...), etc. 

Wenn Sie alle Fehler mit einfachen 500-Antwortcode zu handhaben möchten, können Sie express.errorHandler() mit Ihnen eigene Funktion ersetzen. In diesem Fall Ihr Code wie folgt aussieht:

var express = require('express') 
    , app = express(); 

app.use(app.router); 
app.use(function(err, req, res, next){ 
    if (!err) return next(); 
    res.send(500); 
}); 

// app.get(...), app.post(...), app.listen(...), etc. 

Weitere Informationen über diese Art und Weise in express error example Kommentare in Code könnte

UPDATE gefunden:

Natürlich können Sie Domäne für jede Anforderung verwenden könnte . Sie können jede Anfrage einzeln umbrechen oder Wrapping für den Router verwenden, um ALLE Ausnahmen zu behandeln. Code folgt:

var express = require('express') 
    , http = require('http') 
    , app = express() 
    , domain = require('domain'); 

//app.use(app.router); 
app.use(function(req, res, next){ 
    var d = domain.create(); 
    d.on('error', function(er) { 
     console.log('error, but oh well', er.message); 
     res.send(500); 
    }); 

    // explicitly add req and res 
    d.add(req); 
    d.add(res); 

    d.run(function() { 
     app.router(req, res, next); 
    }); 
}); 

app.get('/', function(req,res){ 
    process.nextTick(function(){ 
     throw new Error('Check Error'); 
    }); 
}); 

http.createServer(app).listen(3000, function(){ 
    console.log('Express server listening on port 3000'); 
}); 

!! ABER !! nie in der Produktion verwenden. Der Grund dafür ist in der Natur, wie JS Arbeit werfen. Es wird definitiv eine Ursache für Lecks in Ihrer Anwendung und machen es noch instabiler. Sie können eine solche Fehlerbehandlung verwenden, um einen benutzerdefinierten Algorithmus zum Herunterfahren zu implementieren (z. B. um bereits geöffnete Verbindungen zu schließen). Weitere Informationen zur richtigen Verwendung der Domäne finden Sie unter documentation.

Um das Leck zu überwachen, können Sie die Technik von this article verwenden.

UPDATE 2:

Ich kann das nicht fertig einfach nicht verlassen. trycatch Code:

var express = require('express') 
    , http = require('http') 
    , app = express() 
    , domain = require('domain') 
    , trycatch = require('trycatch'); 

//app.use(app.router); 
app.use(function(req, res, next){ 
    trycatch(function(){ 
      app.router(req, res, next); 
     }, function(er){ 
      console.log(er.message); 
      res.send(500); 
     }); 
}); 

app.get('/', function(req,res){ 
    process.nextTick(function(){ 
     throw new Error('Check Error'); 
    }); 
}); 

http.createServer(app).listen(3000, function(){ 
    console.log('Express server listening on port 3000'); 
}); 

hatte ich die Quelle trycatch überprüfen und es gab keine jede Magie. Es kann immer noch zu Lecks kommen. trycatch hat domain unter der Haube.

+1

Entschuldigung, dies deckt nicht alle Fälle ab. Ich werde die Frage bearbeiten, um zu erwähnen, dass ich dies bereits berücksichtigt habe. Wenn Sie einen asynchronen Funktionsaufruf haben (z. B. process.nextTick()), dann liegt es außerhalb des Bereichs von express 'error handler, wodurch der Prozess vollständig abgebrochen wird. Es gibt Dinge wie '' 'domains''' und das' '' trycatch''' Modul, die dieses Problem abschwächen, aber ich bin mir nicht sicher, wie man eine Express-Anfrage in eine Domain oder einen trycatch einpackt. – bzuillsmith

+0

Ich habe meine Antwort aktualisiert. Natürlich könntest du das, aber ich denke nicht, dass das eine gute Idee ist. Wahrscheinlich möchten Sie die Anpassung beim Herunterfahren und etwas wie [für immer] (https: // github.com/nodejitsu/forever), damit Ihr Skript fortlaufend ausgeführt wird – andbas

+0

trycatch führt eine große Anzahl von Shimming-Operationen in den Core-Bibliotheken durch, um Lecks und andere Probleme zu vermeiden. Danke für den Code. Nicht sicher, ob ich dasselbe mit trycatch erreichen kann, aber ich denke, dass ich diese Diskussion zum trycatch repo nehme – bzuillsmith

Verwandte Themen