【问题标题】:How to best handle errors in ExpressJS POST routes如何最好地处理 ExpressJS POST 路由中的错误
【发布时间】:2016-11-19 13:00:07
【问题描述】:

我目前正在努力研究 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
  });
});

【问题讨论】:

    标签: angularjs express


    【解决方案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);
            });
    });
    

    在您的 Angular 服务中,您可以创建一个方法,在 Promise 中返回路由数据:

    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);
            });
    });
    

    【讨论】:

    • 你好蓝光!感谢您对 AngularJS 中的错误处理的详细回答。澄清一下:对于 GET 路由,我想使用运行良好的 ExpressJS 错误处理中间件。我现在想知道是否可以对 POST 路由中的错误使用相同的机制,或者直接在 AngularJS 中处理这些错误是否实际上是最佳实践。
    • 对于 POST 路由,方法与上面相同,但将 app.get() 替换为 app.post() 并将 $http.get() 替换为 $http.post() .两种路由之间唯一明显的区别是 GET 用于从数据库中检索数据,而 POST 用于创建数据。
    • 蓝,再次感谢!我认为我没有足够清楚地表达我的观点。请让我再试一次。对于 GET 路由,处理错误的一种既定且良好的方法是直接通过 ExpressJS 中间件(使用 return next(err);)。有没有类似的方法可以直接在 ExpressJS 中处理 POST 路由的错误?
    • 在您的错误中间件函数中,您使用的是 res.render,它将获取提供的数据并将您提供的模板编译到 html 中。由于 POST 请求旨在返回数据,而不是页面内容;我想说你可能不能也不应该这样做。
    • 好的,谢谢你们的cmets!我仍然想知道为什么没有关于直接在 ExpressJS 中使用其中间件处理 POST 路由中的错误的文章,但现在我将根据路由类型来拆分错误处理。
    猜你喜欢
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多