2012-11-02 12 views
19

Próbuję skonfigurować obsługę błędów dla mojej ekspresowej aplikacji i uruchomić następujący problem.Nie można wywołać oprogramowania pośredniego błędu Express 3

ja zdefiniował middleware błędzie i dodać go jako ostatniego pośredniczącego:

// error handler 
app.use(function(err, req, res, next) { 

    console.log('JUST TESTING. ERROR HANLDER HAS BEEN CALLED...'); 
    next(err); 
}); 

Teraz bym tego spodziewać middleware się nazywać, gdy wystąpi błąd:

app.get('/datenschutz', function(req, res, next){ 
     return next(new Error('Just testing')); // handle everything here 
    }); 

Jednak moja middleware nigdy nie jest nazywa! Przeglądarka wyświetla jednak ślad stosu. Wygląda na to, że istnieje inne oprogramowanie pośrednie, które przechwytuje ten błąd i przetwarza go, zanim będę mógł coś z tym zrobić.

Problem polega na tym, że nie mam pojęcia, gdzie to middleware może być zdefiniowany, jak mam bardzo prostą konfigurację:

// setup ssl for local testing 
var 
    app = express(); 

app. 
    use(express.static(__dirname + '/public')). 
    use(express.bodyParser()). 
    use(express.cookieParser()); 

Dlaczego mój błąd obsługi middleware nie jest nazywany? Gdzie jest ta "domyślna" obsługa błędów?

Dzięki!

* EDYTUJ * Widzę, że oprogramowanie pośrednie rzeczywiście działa. Jednak dzieje się tak, jeśli zadzwonię do niego z innej funkcji oprogramowania pośredniego. Jednak nie jest on wywoływany, jeśli błąd występuje wewnątrz funkcji zdefiniowanej jako trasa ekspresowa (GET, POST itp.). To jest bardzo dziwne. Jeśli dodam moje błędzie middleware do wywołania zwrotne trasy to wtedy działa:

app.get('/testError', function(req, res, next){ 
     return next(new Error('Just testing')); // handle everything here 
    }, function(err,req,res,next) { 
     console.log('This error handler is called!!'); 
     return next(); 
    }); 

* EDIT 2 - uznane za dopuszczalne ROZWIĄZANIE ** Dziwię się, że musi to być zrobione w ten sposób. Jak czytałem wiele wpisów/pytań dotyczących obsługi błędów w wyrażeniu i nigdy nie znalazłem tej możliwości. Wygląda jednak na to, że jeśli błąd wystąpi wewnątrz funkcji zwrotnej trasy, zwykłe programy obsługi pośredniej błędu nie będą go pobierać. Będziesz musiał zdefiniować obsługę błędów na poziomie trasy.

app.all('*', function(err,req,res,next) { 
     console.log('This is a global error handler at route level....'); 
     return next(err); 
    }); 
+3

Czy masz 'app.use (app.router)' zanim obsługa błędów jest ustawiona na 'app'? – staackuser2

+0

@emostar - nie. Wszystkie oprogramowanie pośrednie jest wymienione powyżej. – santiagoIT

+9

W porządku, a następnie dodaj 'app.use (app.router)' przed obsługą błędu;) – staackuser2

Odpowiedz

1

EDIT 2 (sabtioagoIT) działa. Ale dla tych, którzy tęsknili, rozwiązanie emostara też działa. Rozumiem, że przenoszę wywołanie obsługi błędów "do końca", ale wydaje się, że jest łatwiejsza opcja, jak sugeruje emulator, użyj app.router (przed wywołaniem błędu "zadzwoń").

3

Miałem również ten problem, ale nie mogłem zrozumieć, dlaczego nie działało, mimo że ustawiłem obsługę błędów po app.user(app.router). Jak się okazało, miałem już obsługę błędów, o której nie wiedziałem.

W szczególności, w przypadku korzystania z ekspresowych CLI wygenerować aplikację tak jak ja, to automatycznie doda w tym w:

if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
} 

Niestety dla mnie, dodałem trochę więcej middleware do mojej aplikacji, która w konsekwencji ukryte to stwierdzenie, a tym samym uniemożliwiło wywołanie mojego niestandardowego programu obsługi błędów.

Po prostu usuń to, a następnie powinno działać poprawnie.

Na marginesie, powinienem wspomnieć, że oryginalne rozwiązanie wciąż działało - nawet z app.use(express.errorHandler()).

app.all('*', function(err,req,res,next) { 
    console.log('This is a global error handler at route level....'); 
    return next(err); 
}); 
1

Zaktualizowana odpowiedź dla użytkowników Express 4 from the Express 4 docs. Zobacz przykład z dokumentów poniżej. Zauważ, że app.router jest przestarzałe i nie jest już używane. Dodałem też obojętne trasę, aby kolejność jasne:

„można zdefiniować obsługi błędów middleware końcu, po drugiej app.use() i wywołuje trasach, na przykład:

var bodyParser = require('body-parser'); 

app.use(bodyParser()); 
app.get('/', function(req, res) { 
    res.send('hello world'); 
}) 
app.use(function(err, req, res, next) { 
    // logic 
}); 

Powiązane problemy