2016-09-20 75 views
1

背景:在Node中,通常會在異步調用中將錯誤對象傳遞給回調函數,Joyent也在Error handling in Node.js中對此進行了說明。標準錯誤對象包含名稱,消息,堆棧跟蹤和可能的附加屬性。將字符串或普通對象傳遞或拋出爲錯誤被認爲是不好的做法。利用Socket.io,可以通過發送事件並具有可選的響應回調,將數據從客戶端傳輸到服務器,反之亦然。這打開了多種方式來傳遞和處理錯誤。Socket.io錯誤傳遞約定

問題:如果來自客戶端的socket.io事件在服務器上導致錯誤,最好的做法是告知客戶端這個問題?一個普通的錯誤對象在響應?一個單獨的錯誤事件和偵聽器?如何構建錯誤?是否有像Node一樣的最佳實踐?你在用什麼?

示例:想象一下用於登錄的socket.io。客戶端通過發送如下用戶名和密碼登錄:

socket.emit('login', {user: 'Foo', pass: 'Bar'}, function (response) { 
    ... 
}); 

成功登錄時,響應包含會話令牌。但是如果用戶名或密碼不匹配怎麼辦?有幾種方法可以想到:

方法1 - 平原錯誤對象:響應可以包含具有一個普通的錯誤狀物體作爲其值的屬性error,具有標準名稱和消息屬性和可能的​​附加的:

{ 
    error: { 
    name: 'InvalidUsernameOrPasswordError', 
    message: 'Username or password was invalid.', 
    usernameExists: false 
    } 
} 

客戶機如果響應包含一個錯誤,如果沒有這樣的測試中,繼續與登錄過程:

socket.emit('login', {user: 'Foo', pass: 'Bar'}, function (response) { 
    if (response.hasOwnProperty('error')) { 
    // handle error 
    } 
    // do something with response.token 
}); 

Appro公司ach 2 - 簡單字符串:與方法1類似,但error屬性只是表示錯誤名稱的純字符串。

{ 
    error: 'InvalidUsernameOrPasswordError' 
} 

這種方法在這個幼稚的例子中很輕而且足夠,但是缺乏傳遞有關錯誤的額外數據的能力。

方法3 - 單獨的事件:服務器可以發出和客戶端監聽其他事件來處理可能的結果:

socket.on('loginError', function (error) { 
    // handle error based on error.name and error.message 
}); 
socket.on('loginSuccess', function (data) { 
    // handle successful login with data.token 
}); 
socket.emit('login', {user: 'Foo', pass: 'Bar'}); 

這種方法感覺最明確,純淨的事件下發的範例,但需要多個事件處理程序。

結論:似乎有很多可能的方式來傳遞和處理錯誤。任何經驗,想法或感覺?

回答

1

這取決於你的「客戶」。如果最終用戶像使用應用程序的人一樣,那麼他們確實不太關心你發送錯誤的方式。最後,你會在前端有一個文本,說他們錯了。因此,您必須選擇您偏好在後端執行錯誤處理的方式。

如果您的客戶不是上述案例的最終用戶,您正在創建應用程序或庫的映像,並且您必須說出錯了。您應該儘可能多地返回信息,以便使用您的應用程序的人員可以識別您的錯誤所在。

所以在最後:

- 對於客戶:您將顯示在前臺你的錯誤,使UPS給你你想要如何管理錯誤。 - 對於開發者:您應該儘可能多地顯示錯誤信息。顯示堆棧跟蹤,錯誤代碼...