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);
});
Czy masz 'app.use (app.router)' zanim obsługa błędów jest ustawiona na 'app'? – staackuser2
@emostar - nie. Wszystkie oprogramowanie pośrednie jest wymienione powyżej. – santiagoIT
W porządku, a następnie dodaj 'app.use (app.router)' przed obsługą błędu;) – staackuser2