2013-12-23 33 views
1

我一直在使用socketIO進行大量測試,並且遇到了處理應用程序僅處於脫機狀態的情況。該文檔沒有提供有關此問題的真正見解。如何處理應用程序未運行時的socketIO

所以,如果我跑我的網站和應用程序節點根本就沒有運行,執行console.log給出:

GET http://[url]:[port]/socket.io/socket.io.js

Uncaught ReferenceError: io is not defined

這並不奇怪,怎麼過什麼,我不明白是如何處理這些錯誤,並簡單地讓腳本嘗試重新連接,直到它終於重新連接(如果曾經)。

我的劇本是這樣的:

<script src="http://[url]:[port]/socket.io/socket.io.js"></script> 
<script> 
    windows.onload = function() 
    { 
     socketio = io.connect("http://[url]:[port]"); 

     socketio.on('connecting', function() { 
       console.log('trying to connect'); 
     });    

     socketio.on('connect', function() { 
        console.log('connected'); 
     });  
    } 
</script> 

有沒有一種方法來處理這類問題?

回答

4

當服務器處於脫機狀態時,用於加載Socket.io客戶端庫的初始<script>標記失敗,因此您永遠無法獲得io對象。

要重試,您可以添加一個新的<script>標籤以再次加載相同的URL並查看是否成功。

更好的是,將socket.io客戶端庫複製到託管您的HTML的服務器,以便始終加載該腳本。然後您可以簡單地處理來自io.connect()的連接錯誤。

+0

如果我添加一個新的

0

有幾個事件可以綁定到。

socket.on("connect_failed", function() { 
    // Do whatever you wanted to do on failure 
}); 

對於暴露事件的完整列表,點擊這裏:exposed socket.io events

編輯

啊,我很抱歉。我誤解了你的問題。我以爲你想在socket服務器脫機時處理。如果你想處理無法獲取socket.io客戶端腳本,也許你可以檢查socket是否爲null或未定義,並處理這種想法。然後還會啓動一個setTimeout函數,在等待期過後嘗試異步加載腳本,然後檢查socket是否仍未定義或爲空。或者,如其他答案所示,將socket.io客戶端庫與您的HTML頁面的其餘部分一起打包。

+0

如果節點應用程序未運行,我不相信它會首先收到'connect_failed' .. – Sir

+0

啊,我很抱歉。我誤解了你的問題。你是對的,你沒有'套接字'來調用開始的事件。正如另一個答案所說,將客戶端庫打包到HTML頁面將會是一個更好的主意。 – zero298

相關問題