2016-08-25 2 views
0

У меня есть приложение, в котором пользователи могут добавлять фильмы в свой список наблюдения. Я хочу запретить пользователям добавлять фильм, который уже существует в их списке наблюдения.Ошибка возврата в Angular из Express

Это моя addMovie функция в моем угловом контроллере:

$scope.addMovie = function (movie) { 
    movieFactory.selectMovie(movie).then(function(response){ 
     movieFactory.addMovie(response); 
     Notification.success(movie.title + ' has been added to your watchlist'); 
     $scope.movies = []; 
     $scope.overlay = false; 
     $scope.searchquery = ''; 
     $rootScope.$broadcast('onAddMovieEvent', response); 
    }); 
}; 

Я передать объект фильма через мой первоначальные нг щелчка. Затем я запрашиваю функцию selectMvoie в movieFactory, которая получает правильные данные фильма из APD TMDB.

Затем я вызываю функцию addMovie на фабрике movieFactory с ответом от selectMovie.

factory.addMovie = function (movie) { 
    var deferred = $q.defer(); 
    $http({ 
     method: 'POST', 
     url: '/movies', 
     data: movie 
    }) 
     .success(function (data) { 
      deferred.resolve(data); 
     }) 
     .catch(function() { 
      deferred.reject(); 
     }); 
    return deferred.promise; 
}; 

Это делает /post запрос, который входит в мой экспресс-маршрут:

router.post('/', function(req,res){ 
    pool.getConnection(function(err, connection) { 

     connection.query('SELECT * FROM user_movieid WHERE movie_id= ? AND userid= ?' ,[req.body.id, req.user.id] , function(err, result) { 
      for (var i = result.length - 1; i >= 0; i--) { 

       if (movie.id === result[i].movie_id) { 
        console.log('exists'); 
       } 
      } 
     }); 
    }); 
}) 

Там также connection.query, которая отправляет фильм в базу данных, но это не актуально сейчас.

Мое положение сейчас в том, что когда я отправляю фильм, который уже существует, моя консоль узла показывает сообщение exists, но все равно публикует фильм (очевидно).

Как вернуть статус «ошибки» обратно в мою функцию addMovie в моем угловом контроллере, чтобы я мог сделать оператор if, чтобы показать другое уведомление?

ответ

1

Если вы хотите, чтобы ваш API «остался спокойным», я вернул бы ответ с кодом состояния не 2xx. Я думаю, что 409 конфликт подходит для этого случая.

router.post('/', function(req,res){ 
    pool.getConnection(function(err, connection) { 

     connection.query('SELECT * FROM user_movieid WHERE movie_id= ? AND userid= ?' ,[req.body.id, req.user.id] , function(err, result) { 
      for (var i = result.length - 1; i >= 0; i--) { 

       if (movie.id === result[i].movie_id) { 
        console.log('exists'); 
        // choose an appropriate status code, probably a conflict 409 in this case 
        return res.status(409).send('Movie already exists in your watchlist') 
       } 
      } 
     }); 
    }); 
}) 

Тогда в вашем Угловом коде вы можете уведомить пользователя, что фильм уже находится в их списке.

$scope.addMovie = function (movie) { 
    movieFactory.selectMovie(movie).then(function(response){ 
     movieFactory.addMovie(response); 
     Notification.success(movie.title + ' has been added to your watchlist'); 
     $scope.movies = []; 
     $scope.overlay = false; 
     $scope.searchquery = ''; 
     $rootScope.$broadcast('onAddMovieEvent', response); 
    }) 
    // catch any errors 
    .catch(function() { 
     // ideally you should check the status code here and probably handle other non 409 status codes differently 
     // since this .catch will execute for any other 4xx and 5xx errors 
     Notification.fail(movie.title + ' is already in your watchlist'); 
    }); 
}; 
+0

Спасибо, мне пришлось немного изменить код, чтобы получить .catch в правильном запросе на заводе, но он работает сейчас. –

Смежные вопросы