2014-01-16 65 views
3

在我看來,沒有辦法捕捉到節點tls失敗的連接。節點js連接失敗時,TLS未被捕獲的錯誤?如何捕捉?

tls.connect(port, host, options, function(){ 
    // on connected 
}) 

由於代碼是異步的,我不能把它包裝到try catch中。我似乎沒有發現一個事件表明ECONNREFUSED失敗。 http://nodejs.org/api/tls.html#tls_tls_connect_options_callback

相反,該過程只是崩潰並退出。雖然我能夠用uncaughtException處理程序捕捉它。但我無法找出一種方法來從該處理程序的錯誤中恢復。當程序到達那裏時,甚至不知道那個連接失敗了。

那麼我們如何捕捉失敗的連接呢?

+0

。 stream.on('錯誤')看起來像我們應該使用的東西,但該事件似乎並沒有得到信號。 –

+0

不要說我的評論,我在同一時間做了http請求,而ECONNREFUSED來自它。我有最新的node.js和tls.connect()流('error',fn)就像它應該這樣做!考慮接受洛根的答案,如果它幫助你! –

回答

5

tls.connect方法返回一個流對象,你應該綁定一個error處理程序。

這樣可以很清楚:

tls.connect(port, host, options, function(){ 
    // on connected 
}); 

是短期的這樣的:

var stream = tls.connect(port, host, options); 
stream.once('secureConnect', function(){ 
    // on connected 
}); 

所以你需要添加另一個處理程序以偵聽的錯誤,而不是成功的連接:

var stream = tls.connect(port, host, options); 
stream.once('secureConnect', function(){ 
    // on connected 
}); 
stream.on('error', function(err){ 
    // on error 
}); 
+0

這正是我的想法,但stream.on('error',fn)似乎沒有在ECONNREFUSED上調用。 –

+0

不要說我的評論,我正在做的HTTP請求在同一時間和ECONNREFUSED源於它。我有最新的node.js和tls.connect()流('error',fn)就像它應該這樣做! –

0

tls.connect()創建一個新的客戶端連接到給定的porthosttls.connect()返回一個tls.TLSSocket對象。

您可以使用下面的代碼來處理錯誤。

var options = { 
host: 'example.com', 
port: 443 
}; 

var socket = tls.connect(options, function() { 
    // Connected 
}); 
socket.on('error', function(err) { 
    // on error 
}); 

查找更多信息我有完全相同的問題here