背景:在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'});
這種方法感覺最明確,純淨的事件下發的範例,但需要多個事件處理程序。
結論:似乎有很多可能的方式來傳遞和處理錯誤。任何經驗,想法或感覺?