2012-03-03 66 views
24

這是我的代碼(它的CoffeeScript中並使用顏色區分,但是這是不相關)如何捕獲像EADDRINUSE這樣的node.js/express服務器錯誤?

# 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_serverexpress.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 2012-03-03 10:02:40

+3

基本上,快速服務器是[http服務器] (http://nodejs.org/docs/latest/api/http.html#http_class_http_server),這是一個事件發佈器。 – 2012-03-03 10:43:37

+0

這是否仍然在最新版本的Node中工作?請檢查下面的答案,並在需要時更新你的答案。 – Hubro 2013-05-13 13:28:34

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 2013-10-31 22:17:51

相關問題