2013-03-28 18 views
18

Sto cercando di ottenere la gestione degli errori in esecuzione con Express ma invece di vedere una risposta di "errore !!!" come mi aspetto di vedere "qualche eccezione" sulla console e poi il processo viene ucciso. È così che si suppone che la gestione degli errori sia impostata e, in tal caso, esiste un altro modo per rilevare gli errori?Gestione errori js Express

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

risposta

23

Un esempio app/guida sulla gestione degli errori è disponibile presso https://expressjs.com/en/guide/error-handling.html Tuttavia dovrebbe risolvere il tuo codice:

// 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

Per le persone dal futuro, app.router è deprecato per il processo di migrazione 3.x => 4.x; vedere https://github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x. –

7

Alcuni consigli:

1) Il codice non funzionava perché il middleware del gestore degli errori è stato eseguito prima del raggiungimento del percorso, pertanto il gestore degli errori non ha mai avuto la possibilità di ricevere l'errore. Questo stile è noto come continuation passing. Metti il ​​tuo gestore degli errori per ultimo nella pila del middleware.

2) È necessario arrestare il server in caso di errore non gestito. Il modo migliore per farlo è quello di chiamare server.close(), dove server è il risultato di fare var server = http.createServer(app);

Il che significa, si dovrebbe fare qualcosa di simile:

var server = http.createServer(app); 

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

si dovrebbe probabilmente anche il tempo la server.close(), nel caso in cui non si può completare (la vostra applicazione è in uno stato indefinito, dopo tutto):

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

ho fatto una libreria che fa tutto questo per voi, e consente di definire risposte personalizzate, tra cui specializzata visualizzazioni di errori, file statici da pubblicare, ecc ...:

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

+1

"Dovresti spegnere il server"? Perché? No! Non dovresti! – fiatjaf

+0

Se si verifica un errore non gestito, è assolutamente necessario arrestare il server, poiché l'errore potrebbe lasciare l'app in uno stato indefinito, il che significa che le cose potrebbero andare storte. La chiusura offre all'app la possibilità di ripararsi riavviando in uno stato stabile. –

+0

quindi se qualcuno ha attivato un'eccezione non gestita, l'intera app sarà disattivata per tutti?è stupido – astroanu

2

Ho avuto lo stesso problema e non riusciva a capire cosa non andava. Il problema è che se hai definito errorHandler espresso, il tuo gestore di errori personalizzato non viene mai chiamato. Se si dispone il codice successivo, è sufficiente rimuovere:

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

Ha lavorato per me :)

+0

Ti suggerirei di usare 3 '=' quindi digita anche i checks solo per buona hait :) –

1

Installazione Installazione rapida connect-dominio, quindi qualcosa di simile:

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

// nostro gestore degli errori

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

Poi, quando la creazione di endpoint, errorHan tack dler alla fine in un uso():

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