2016-11-19 74 views
0

我目前正在努力處理ExpressJS路線中的錯誤處理的最佳做法,特別是POST路線。如何最好地處理ExpressJS POST路線中的錯誤

我已經設置了默認的中間件錯誤處理,如果有任何錯誤,我使用return next(err);。這適用於GET路由中的所有錯誤。

但是,處理其他路由類型(尤其是POST路由)中的錯誤的最佳做法是什麼?

在前端,我使用的是AngularJS,我使用$http發佈。在POST路由中使用return next(err);時,$http.error(function(data,status,headers,config)被稱爲(AngularJS),我收到數據變量中的整個html錯誤頁面。

我正在尋找的是用戶重定向到通過ExpressJS中間件的一般錯誤頁面,以防客戶端不應該處理這個錯誤。這樣,我也可以在一個地方進行錯誤處理和日誌記錄。

所以,我目前的想法:在POST路線中,只需做return res.status(500).send({err: err});如果應用程序無法恢復,那麼在客戶端使用AngularJS重定向到一般錯誤頁面。但是,我更願意使用ExpressJS中間件來處理錯誤。

我感謝任何幫助或指向最佳實踐文章!

作爲參考,(標準)錯誤的中間件功能如下:

app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('shared/error/error', { 
    message: err.message, 
    error: err 
    }); 
}); 

回答

1

如果您使用的角度$ HTTP方法爲GET或POST到你的服務器,你應該返回JSON數據備份到應用程序解析。例如,你的路線:

app.get('/example', function(req, res) { 
    getSomeData() 
     .then(function(data) { 
      res.status(200).json(data); 
     }, function(err) { 
      res.status(400).json(err); 
     }); 
}); 

在你的角度服務,您可以創建在一個承諾返回路徑的數據的方法:

angularApp.service('DataService', function($http) { 
    this.getData = function() { 
     return $http.get('/example') 
    }; 
}); 

然後使用該服務在您的控制器是這樣的:

angularApp.controller('MyController', function($scope, DataService) { 

    DataService.getData() 
     .then(function(response) { 
      $scope.data = response.data; 
     }, function(err) { 
      showErrorMessage(err.statusText); 
     }); 
}); 
+0

Hello Blu!感謝您對AngularJS錯誤處理的詳細解答。澄清:對於GET路由,我想使用運行良好的ExpressJS錯誤處理中間件。我現在想知道,如果我可以在POST路由中使用相同的機制來處理錯誤,或者它實際上是直接在AngularJS中處理這些錯誤的最佳實踐。 – Alexander

+0

對於POST路由,該方法將與上面相同,但用app.post()替換app.get(),用$ http.post()替換$ http.get()。兩條路線之間唯一明顯的區別在於,GET用於從數據庫檢索數據,POST用於創建數據。 –

+0

Blu,再次感謝!我想我沒有足夠清楚地表達我的觀點。請讓我再試一次。對於GET路由,通過ExpressJS中間件(使用return next(err);)直接通過一種已建立好的方式處理錯誤。有沒有類似的方式直接在ExpressJS中處理POST路由錯誤? – Alexander