2013-03-28 18 views
18

Próbuję uruchomić obsługę błędów za pomocą funkcji express, ale zamiast zobaczyć odpowiedź "error !!!" tak jak oczekuję, że widzę "jakiś wyjątek" na konsoli, a następnie proces zostaje zabity. Czy należy konfigurować przekazywanie błędów, a jeśli tak, to czy istnieje inny sposób na wychwycenie błędów?Obsługa błędów Express js

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

app.use(function(err, req, res, next) { 
    console.log("error!!!"); 
    res.send("error!!!"); 
}); 

app.get('/', function(request, response) { 
    throw "some exception"; 
    response.send('Hello World!'); 
}); 

app.listen(5000, function() { 
    console.log("Listening on 5000"); 
}); 

Odpowiedz

23

Przykładem app/poradnik obsługi błędów jest dostępna na https://expressjs.com/en/guide/error-handling.html Należy jednak naprawić swój kod:

// Require Dependencies 
var express = require('express'); 
var app = express(); 

// Middleware 
app.use(app.router); // you need this line so the .get etc. routes are run and if an error within, then the error is parsed to the next middleware (your error reporter) 
app.use(function(err, req, res, next) { 
    if(!err) return next(); // you also need this line 
    console.log("error!!!"); 
    res.send("error!!!"); 
}); 

// Routes 
app.get('/', function(request, response) { 
    throw "some exception"; 
    response.send('Hello World!'); 
}); 

// Listen 
app.listen(5000, function() { 
    console.log("Listening on 5000"); 
}); 
+8

Dla osób z przyszłości app.router jest nieaktualny w procesie migracji 3.x => 4.x; zobacz https://github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x. –

7

kilka porad:

1) Twój kod nie działa ponieważ Twoje oprogramowanie pośredniczące do obsługi błędów zostało uruchomione zanim twoja trasa została osiągnięta, więc program obsługi błędów nigdy nie miał szansy na przekazanie błędu. Ten styl jest znany jako przekazywanie kontynuacji. Umieść ostatnią procedurę obsługi błędów w stosie oprogramowania pośredniego.

2) Należy zamknąć serwer, gdy wystąpi nieobsługiwany błąd. Najlepszym sposobem na to jest zadzwonić server.close(), gdzie serwer jest wynikiem robi var server = http.createServer(app);

co oznacza, powinieneś zrobić coś takiego:

var server = http.createServer(app); 

app.use(function(err, req, res, next) { 
    console.log("error!!!"); 
    res.send("error!!!"); 
    server.close(); 
}); 

powinieneś też czas na zewnątrz server.close(), w przypadku gdy nie można wykonać (aplikacja jest w nieokreślonym stanie, mimo wszystko):

var server = http.createServer(app); 

app.use(function(err, req, res, next) { 
    console.log("error!!!"); 
    res.send("error!!!"); 

    server.close(); 

    setTimeout(function() { 
    process.exit(1); 
    }, 3*1000); 
}); 

zrobiłem bibliotekę że to wszystko dla was, i pozwala definiować własne reakcje, w tym wyspecjalizowane wyświetlenia błędów, pliki statyczne do wyświetlenia itp ...:

https://github.com/ericelliott/express-error-handler

+1

"Powinieneś wyłączyć serwer"? Czemu? Nie! Nie powinieneś! – fiatjaf

+0

Jeśli masz nieobsługiwany błąd, bezwzględnie powinieneś wyłączyć serwer, ponieważ błąd może pozostawić aplikację w stanie niezdefiniowanym - co oznacza, że ​​coś może pójść nie tak. Wyłączenie daje aplikacji szansę na naprawę poprzez ponowne uruchomienie w stabilnym stanie. –

+0

, więc jeśli ktoś wyzwolił nieobsługiwany wyjątek, cała aplikacja będzie niedostępna dla wszystkich?to jest głupie. – astroanu

2

miałem ten sam problem i nie mogliśmy zorientować się, co się stało. Chodzi o to, że jeśli zdefiniowano wyrażenie expressHandler, to obsługa niestandardowego błędu nigdy nie jest wywoływana. Jeśli masz następny kod, wystarczy wyjąć go:

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

pracował dla mnie :)

+0

Proponuję użyć 3 '=' więc to sprawdza również zbyt dobrze dla dobrego habbit :) –

1

Instalacja ekspresowa zainstalować połączyć domenach, coś takiego:

var express = require("express"), 
    connectDomain = require("connect-domain"), 
    app = express(), 
    errorHandler; 

// Nasz obsługa błędów

app.use(connectDomain()); 
    errorHandler = function (err, req, res, next) { 
     res.send(500, { 
      "status": "error", 
      "message": err.message 
     }); 
    console.log(err); 
}; 

Następnie podczas konfigurowania punktów końcowych, błąd tackHan dler na końcu w użyciu():

app.get("/some/data", function (req, res) { 
    // ... do some stuff ... 
    res.send(200, "Yay! Happy Success!"); 
}).use(errorHandler);