2014-09-22 74 views
0

可以說我正在使用Express來構建一個簡單的API來POST和GET客戶對象。處理來自多個來源的響應錯誤

(請忽略語法,或任何表達特異性這僅僅是寫在SublimeText解釋我的問題自由形式。)

在我的路線,我認爲這種看起來像這樣的方法:

// Main Express index.js server file. 
function getCustomer(req, res, next) { 
    var q = request.query; 
    Customer.findByCustomerId(q.customerId, function(error, customer) { 
     if (error) { // No idea if this is a Mongo Error, NotFound Error, InactiveError, something else from some other part of the app! 
      res.send("??????"); 
      return next(); 
     } 
     res.send(201, customer.JSONResponse()); 
     return next(); 
    }); 
} 

// Customer.js Mongoose Model in separate file. 
Customer.statics.findByCustomerId = function(customerId, callback) { 
    this.findOne({customerId : customerId}, function(error, foundCustomer) { 
     if (error) { // MONGO ERROR, Something is really broken. 
      return callback(error, null); 
     } 
     if (!foundCustomer) { // Didn't find a customer so lets send that back. 
      return callback(new Error("No customer found"), null); 
     } 

     if (foundCustomer.status == "inactive") { // Lets just say a customer being inactive is error worthy. 
      return callback(new Error("The customer you have specified is inactive"), null); 
     } 

     return callback(null, foundCustomer); 
    }); 
}; 

幾件事情可能發生在這裏:

  1. 有效的客戶存在,並與空返回錯誤。

  2. MongoDB有一個錯誤,並將它發送給null客戶的回調。

  3. 我定製的客戶通過取景器ID方法有一個錯誤:

    一個。沒有找到客戶。

    b。客戶被發現但不活躍。

如何處理用正確的錯誤發送響應? (如果沒有一個開關或者混亂​​。)

  • 如果它是一個蒙戈的錯誤,我想送一個通用的500

  • 如果沒有找到客戶,我想送一個404友好的信息。

  • 如果找到客戶但未激活,我想發送其他錯誤響應。

是否有一個一般的指導方針或最佳做法爲這個sitauation?

預先感謝您!

回答

1

所以,是的。一般來說,處理這個問題的最好方法是將自定義錯誤提示出來,然後讓一些Express中間件以適當的方式處理這些錯誤。

因此,例如,而不是new Error("No customer found");,您可以創建一個RecordNotFoundError然後實例化並拋出。這使得錯誤處理中間件更容易。例如,您的Error子類可以實現代碼或狀態屬性,該屬性直接映射到要發送的HTTP狀態代碼(用於一致的中間件處理)。

我也會確保你以正確的方式封裝你的邏輯。對我而言,客戶的'主動'標誌應該只是一個過濾標準。如果這是默認情況下你只想看到活躍的人,那麼對我來說,這應該與記錄未找到的情況沒有什麼不同。也就是說,如果你真的希望它由於某種原因成爲它自己的錯誤,那麼創建一個CustomerNotActiveError子類,並決定你認爲合適的HTTP狀態碼。

不同的情況下仍然需要像你一樣處理,但好處是你的控制器邏輯變得更簡單,你只需要從客戶渲染/發送數據,或者你回調了發送的錯誤。正如我所說的,一個通用的錯誤處理中間件然後可以接收這些錯誤,並檢查它們的namestatus以決定如何處理它們,儘管根據我的經驗,最簡單的做法是讓每個錯誤定義它自己的HTTP狀態代碼,這樣你就不需要開關或者如果你描述的那樣混亂。或者,如果你有一個if,你至少可以簡化並用它來決定是否記錄錯誤(大部分你會,但有些你可能不會)。一個觀察,你在你的示例代碼中將狀態設置爲201,但是如果你只是做一個查找,正確的代碼是200;如果你真的創造了一件新事物,那麼201就是正確的。

+0

我還沒有測試這個。回覆晚了非常抱歉。當我有一些東西被整理出來時,會回覆。你的答案可能是這樣,但我很猶豫是否關閉這個話題,因爲如果沒有問題,我可能會跟進問題。 – Andrew 2014-09-30 10:53:33