2012-03-03 3 views
24

Это мой код (это CoffeeScript и использует цвета, но это не имеет значения)Как уловить ошибки node.js/express сервера, такие как 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 является express.js server. Мне трудно понять, почему ошибки, вызванные в результате hons_server.listen(), не попадают в try/catch. Когда я запускаю мой сервер дважды я получаю результат:

 
$ 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) 

я хотел бы знать, почему выброшенная ошибка не поймана, и как/где я могу поймать ошибку EADDRINUSE.

ответ

17

Прослушайте error события на сервере isntance

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

из любопытства, как вы знаете, что? Я знаю, что это было не в [документации] (http://expressjs.com/guide.html), и я не могу найти ничего, на каких событиях поддерживает экспресс-сервер – Hubro

+3

. В принципе, экспресс-сервер является [http Server] (http://nodejs.org/docs/latest/api/http.html#http_class_http_server), который является эмитентом событий. –

+0

Это все еще работает в новейшей версии узла? Пожалуйста, ознакомьтесь с приведенным ниже ответом и при необходимости обновите свои данные. – Hubro

22

Принятое решение не работает для меня на nodejs 0.8.22 и выразить 3.1.0.

Это сделал трюк:

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

Также см Node.js Express app handle startup errors

+0

да, спасибо. – qodeninja

Смежные вопросы