2012-12-29 10 views
7

Niedawno rozpocząłem pracę nad aplikacją opartą na Express.js, która również korzysta z modułu pg (https://github.com/brianc/node-postgres)Centralizacja obsługi błędów w aplikacji opartej na Express.js

Spędziłem również znaczną ilość czasu, czytając o obsłudze błędów węzła i wyrażania, korzyściach z właściwego zaprojektowania oprogramowania pośredniczącego itd. Jednak powtarzający się problem wciąż budzi mnie bez rozwiązania.

Powiedz, mam następujący sposób Router:

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 
    }); 
}); 

Jeśli Czytałem poprawnie, należy to właściwy sposób to zrobić. Założę się jednak, że możesz również przyznać, że jest to zbyt wiele z podstaw do przepisywania w kółko ... i od nowa, nawet w tej samej metodzie routera, na wypadek, gdybyśmy mieli wiele zagnieżdżonych wywołań zwrotnych.

Zadaję sobie pytanie, jaki byłby najlepszy sposób radzenia sobie z taką sytuacją centralnie. Wszystkie moje pomysły obejmują przechwytywanie metody pgClient.query. W jednym, metoda zapytania po prostu wyrzuci błąd zamiast przekazać go do wywołania zwrotnego. W innym, wywołanie pgClient.query spowoduje wysłanie metody routera obok pgClient. Następnie przechwycona metoda zapytania będzie wiedziała, jak sobie poradzić z następnym przekazanym do niej.

Z tego, co wiem, rzucanie błędów wokół nich nie jest właściwym sposobem, aby dostać go do 500 procedur obsługi. Z drugiej strony, passin jako opcja do pgClient daje tak niski poziom dużo wiedzy na temat powyższych warstw, które w oparciu o moją wiedzę i doświadczenie mogą prowadzić do sprzężenia, i nie jest zbyt dobra.

Co sugerujesz?

+0

'/: Coś /: someId'? –

+0

tak, zmieniłem to – user1219569

+0

nie, myślałem o jednej trasie dla wszystkich 500 próśb. –

Odpowiedz

11

Można użyć oprogramowania pośredniego connect-domain. Działa z connect i express i bazuje na API Doman.

Należy dodać oprogramowanie pośrednie connect-domain jako pierwsze oprogramowanie pośrednie w stosie. To wszystko. Teraz możesz zgłaszać błędy wszędzie w swoim kodzie asynchronicznym i będą one obsługiwane za pomocą oprogramowania pośredniego domeny i przekazywane do wyrażenia obsługi błędów.

Prosty przykład:

// 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'); 
    }); 
}); 
Powiązane problemy