2012-12-29 3 views
7

Ich habe gerade angefangen, an einer express.js-basierten Anwendung zu arbeiten, die auch das pg-Modul verwendet (https://github.com/brianc/node-postgres)Zentralisierung der Fehlerbehandlung in einer express.js-basierten App

Ich verbrachte auch eine erhebliche Menge an Zeit, Lesen über Knoten und Express-Ansatz Fehlerbehandlung, die Vorteile der richtigen Gestaltung Middleware, etc. Doch ein immer wiederkehrendes Problem brummt mich immer noch ohne eine Lösung.

Sag mal, ich habe folgendes Router Methode:

app.get("/:someThing/:someId", function(req, res, next) { 
    pgClient.query("some SQL query", function(err, data) { 
    if (err) { return next(err); } // some 500 handler will take it 
    if (data.rows.length == 0) { 
     next(); // send it over to a 404 handler 
    } 

    //finally, here we get the chance to do something with the data. 
    //and send it over via res.json or something else 
    }); 
}); 

Wenn ich das richtig gelesen habe, soll dies der richtige Weg, es zu tun. Aber ich wette, Sie können auch annehmen, dass es zu viel Standard ist, um immer wieder neu zu schreiben ... und immer wieder, sogar in der gleichen Router-Methode, falls wir mehrere verschachtelte Callbacks haben.

Ich habe mich gefragt, was der beste Weg, um eine solche Situation zentral zu behandeln wäre. Alle meine Ideen beinhalten das Abfangen der pgClient.query-Methode. In einem Fall wirft die Abfrage-Methode einfach den Fehler, anstatt ihn an den Callback zu übergeben. In einem anderen wird der Aufruf der pgClient.query die Router-Methode neben pgClient senden. Dann wird die abgefangene Abfragemethode wissen, wie mit dem nächsten übergebenen Abfragemethode umzugehen ist.

Von dem, was ich weiß, ist das Werfen von Fehlern nicht wirklich der geeignete Weg, um es zu den 500 Handlern zu bekommen. Auf der anderen Seite, als Option zu pgClient, gibt ein so niedriges Niveau eine Menge Wissen über die obigen Schichten, die basierend auf meinem Wissen und meiner Erfahrung zur Kopplung führen können, und ist auch nicht sehr gut.

Was schlagen Sie vor?

+0

'/: something /: someId'? –

+0

ja, habe ich es – user1219569

+0

nein, dachte ich über einen Weg für alle 500 Anfragen. –

Antwort

11

Sie können connect-domain Middleware verwenden. Es funktioniert mit connect und express und basiert auf Doman API.

Sie benötigen connect-domain Middleware als erste Middleware in Stapel hinzuzufügen. Das ist alles. Jetzt können Sie Fehler überall in Ihrem asynchronen Code auslösen, und sie werden mit Domänen-Middleware behandelt und an einen Fehler-Handler übergeben.

Einfaches Beispiel:

// Some async function that can throw error 
var asyncFunction = function(callback) { 
    process.nextTick(function() { 
     if (Math.random() > 0.5) { 
      throw new Error('Some error'); 
     } 
     callback(); 
    }); 
}; 

var express = require('express'); 
var connectDomain = require('connect-domain'); 

var app = express(); 
app.use(connectDomain()); 
// We need to add router middleware before custom error handler 
app.use(app.router); 

// Common error handler (all errors will be passed here) 
app.use(function(err, req, res, next){ 
    console.error(err.stack); 
    res.send(500, 'Something broke!'); 
}); 

app.listen(3131); 

// Simple route 
app.get('/', function(req, res, next) { 
    asyncFunction(function() { 
     res.send(200, 'OK'); 
    }); 
});