簡體   English   中英

用socket.emit處理Node.js錯誤

[英]Node.js error handling with socket.emit

我有一些node.js客戶端代碼,如下所示:

socket.emit('clickAccept', { myrecid: recid });

服務器端node.js代碼很好,一切都很好。

如果我將服務器關閉以模擬服務器端中斷,然后在客戶端單擊觸發此socket.emit的按鈕,則會發生以下情況:

  • 沒什么,我想最終可能會超時
  • 當我重新啟動服務器時,點擊最終會被發送到服務器並且服務器會對它們起作用(類似TCP的猜測)。

我想要發生的是那些socket.emit調用在短暫超時后死亡而不是在服務器恢復時發送,它會引起各種混亂,因為如果他們點擊3次,沒有任何反應,那么當/如果連接或服務器恢復,他們一次得到3個反應。

此外,如果他們點擊並因服務器關閉而超時,我想向客戶端用戶顯示錯誤,讓他們知道基本上點擊不起作用並再試一次。

我知道如果套接字關閉時如何操作並顯示錯誤但是如果他們當時沒有嘗試點擊某些內容我不想這樣做。 沒有任何意義是在用戶處觸發錯誤,因為如果他們在那個時刻不需要做任何事情的話,套接字會短暫停止。

所以,要清楚,我只想在他們點擊按鈕並且客戶端和服務器之間的套接字關閉時顯示錯誤。 AND ...如果他們收到錯誤,我想殺掉那些發射,而不是將它全部保存起來並在幾秒鍾后服務器重新啟動時觸發它以及所有其他點擊。

在此先感謝,我希望這至少是相當清楚的。

感謝您的其他答案和幫助。 我最終以一種非常簡單的方式解決了這個問題。 見下文:

if (socket.connected){ // Do your thing here } else { // Throw error here that tells the user they're internet is likely down }

希望這可以幫助那些人,我們的代碼是一個巨大的改進,以確保用戶得到適當的反饋,如果他們有短暫的網絡/互聯網中斷。

您的問題的根源是socket.io嘗試緩沖當前無法發送到服務器的任何數據(因為與服務器的連接已斷開),並且當服務器重新啟動並恢復連接時,則發送該數據。

您可以在此處查看有關其工作原理的技術詳細信息: socket.io在x秒/第一次失敗后嘗試獲取響應時停止重新發出事件

您有幾個實現選項:

  1. 如果socket.io已經知道客戶端沒有連接到服務器,那么就不要緩沖數據(甚至可能會給你一個錯誤,以便向用戶顯示)。

  2. 當socket.io重新連接並且在連接斷開時緩沖數據時,清除該數據並將其丟棄,以便在重新連接時不發送舊數據。

  3. 在某種超時后實現超時以執行上述操作之一。

所以,要清楚,我只想在他們點擊按鈕並且客戶端和服務器之間的套接字關閉時顯示錯誤。 AND ...如果他們收到錯誤,我想殺掉那些發射,而不是將它全部保存起來並在幾秒鍾后服務器重新啟動時觸發它以及所有其他點擊。

也許,最簡單的方法是實現上面引用的答案中顯示的版本:

Socket.prototype.emitWhenConnected = function(msg, data) {
    if (this.connected) {
        this.emit(msg, data);
        return null;
    } else {
        return new Error("not connected");
    }
}

然后,將代碼從使用.emit()切換為使用.emitWhenConnected()並在使用時檢查返回值。 如果返回值為null ,則未檢測到錯誤。 如果返回值不為null,則表示存在錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM