Где обрабатывать ошибки бэкэнда AngualrJS - PullRequest
0 голосов
/ 19 ноября 2018

При рассмотрении приложения AngularJS меня поразило, что я действительно не знаю, как обрабатывать ошибки из базы данных на уровне контроллера.

У нас есть трехуровневая структура controller -> service -> rest

Служба Rest обрабатывает вызовы к внутренней базе данных и возвращает услугу промежуточного уровня, которая в большинстве случаев передает ее контроллеру

myController.js

myService.getdata().then(function (result) {
  $scope.data = result
})

myService.js

this,getdata = function () {
  return RestService.get('url/to/my/data')
}

RestService успешно возвращает ошибки из Back End API (через hapi / Boom)и они могут быть пойманы либо myService, либо myController.То, с чем я борюсь, это создание обработчика ошибок в службе, а не в контроллере.

Моя лучшая попытка в контроллере заключается в следующем:

  .then(function (result) {
    $scope.data = result
    // do something with the data
  })
  .catch(function (error) {
    console.error('data could not be loaded')
  })
  .finally(function () {
    // tidy up here
  })

Я бы предпочел переместитьобработка ошибок в сервисе, но я не уверен, как контроллер будет ожидать получения данных для обработки ...

1 Ответ

0 голосов
/ 20 ноября 2018

Лучшее, что я придумал, - это обработка ошибок в сервисе и создание дополнительных обещаний для отправки обратно на контроллер:

this.getdata = function () {
  //returns the $q.resolve or $q.reject promises with customized data
  return RestService.get('url/to/my/data').then(function(response) {
    // format the data differently from response, etc.
    var _data = customProcessing(response.data);

    // you can even decide, on your own if there is an error
    // if(someCondition) { return $q.reject("Custom error"); }

    return $q.resolve(_data);
  }).catch(function(error) {
    // throw up a modal, etc.
    var _error = customProcessing(error);
    return $q.reject(_error);
  }).finally(function() {
    //to do
  });
}

Этот пример позволяет вашему сервисному уровню действовать как промежуточное ПО. Он получает данные, а затем, после выполнения своих собственных функций, возвращает управление обратно контроллеру:

myService.getdata().then(function (data) {
  $scope.data = data;
}).catch(function(error) {
  //optional catch clause. I use it to stop loading spinners
  //or to show error message below a form
});

Вот рабочий пример: https://plnkr.co/edit/35zx59yHUJ1Zrf5LWp3W?p=preview

...