2012-03-03 11 views
24

To jest mój kod (to coffeescript i używa kolorów, ale to nie jest istotne)Jak przechwycić błędy serwera node.js/express, takie jak EADDRINUSE?

# If this module is executed 
if !module.parent 
    # Start server 
    try 
     hons_server.listen config.port 
     console.log 'Listening to port ' + config.port 
    catch err 
     console.error "Couldn't start server: #{String(err)}".red 

hons_server jest express.js server. Trudno mi zrozumieć, dlaczego błędy rzucane w wyniku hons_server.listen() nie są przechwytywane przez próbę/catch. Kiedy uruchomić mój serwer dwukrotnie pojawia się komunikat:

 
$ coffee src/server.coffee 
Listening to port 9090 

node.js:201 
     throw e; // process.nextTick error, or 'error' event on first tick 
      ^
Error: listen EADDRINUSE 
    at errnoException (net.js:632:11) 
    at Array.0 (net.js:733:26) 
    at EventEmitter._tickCallback (node.js:192:40) 

chciałbym wiedzieć dlaczego wyrzucony błąd nie zostanie złapany, i jak/gdzie mogę złapać błąd EADDRINUSE.

Odpowiedz

17

wykrywać zdarzenie error na serwerze isntance

hons_server.on 'error', (err) -> 
    console.log 'there was an error:', err.message 
+0

z ciekawości, skąd wiesz, że? Wiem, że nie było go w [dokumentacji] (http://expressjs.com/guide.html) i nie mogę znaleźć niczego na temat zdarzeń obsługiwanych przez serwer ekspresowy – Hubro

+3

Zasadniczo, serwer ekspresowy to [serwer http] (http://nodejs.org/docs/latest/api/http.html#http_class_http_server), który jest emiterem zdarzeń. –

+0

Czy to nadal działa w najnowszej wersji węzła? Sprawdź poniższą odpowiedź iw razie potrzeby zaktualizuj swoją. – Hubro

22

Przyjęte rozwiązanie nie działa dla mnie na nodejs 0.8.22 i wyrażania 3.1.0.

To załatwiło sprawę:

process.on('uncaughtException', function(err) { 
    if(err.errno === 'EADDRINUSE') 
     console.log(...); 
    else 
     console.log(err); 
    process.exit(1); 
});  

Zobacz również Node.js Express app handle startup errors

+0

tak, dziękuję. – qodeninja

Powiązane problemy