Jak przekazac angularowi blad podczas $http (PHP)

0

Czesc, zastanawiam sie jak przekazac blad w phpie, tak zeby podczas metody $http wywolal sie error. Przekazywalem false, ale $http nie chce tego przechwycic i przejsc do error, dlatego zrobilem to w glupi sposob, czyli w phpie jest jakas akcja, jesli jest blad to zwracam echo "error", a wtedy angular podczas metody $http, rejestruje czy jest owy string "error", jesli tak to odrzucamy promise, a jesli nie to kontynuujemy obietnice. Jest to glupi sposob, bo chcialbym przekazywanie bledow robic w metodzie error dla $http, jak przykazalo.

A to fragment mojego kodu.

To jest ten glupi sposob, bo metoda error nie chce zlapac blad podczas pobierania

    return {
     getData: function() {
       var deferred = $q.defer();
       $http.get('api/users')
         .success(function(data) {  
          data == "error" ?  deferred.reject("handle error") :  deferred.resolve({data});
         });
       return deferred.promise;
     }
  }
 

a tutaj php

			$vm = new Space;
	
			
				$db = $vm->connection();
				if($db){
					$sql = "select * FROM users ORDER BY id";
					$stmt = $db->query($sql);  
					$wines = $stmt->fetchAll(PDO::FETCH_OBJ);
					$db = null;
					echo json_encode($wines);
				}else{
					echo "error";
				}
 

Rowniez glupi sposob, probowalem try, catch w tym phpie, ale i tak na koncu angular traktowal ten process jako $http success, a jako dane dostawalem error phpowy w postaci stringow, czyli rzekomo 'success', niestety nie wiem jak zarejestrowac to jako blad, nie jako string pobierany. False probowalem wstawic ale cos nie wyszlo.

1

Angular złapie error jesli status będzie wskazywał na błąd.
Wyślij z PHP header z odpowiednim błędem, np.:

try {
//...
} catch (Exception $e) {
    header("HTTP/1.1 500 Internal Server Error");
    echo '{"data": "Exception: '.$e->getMessage().'"}';
}
0

Dzieki wielkie, dziala jak nalezy. Mam jeszcze jedno pytanie, niezwiazane z tym, ale z angularem. A mianowicie jest jakas mozliwosc zrobienia ng-if i sprawdzenia wartosci tablicy? I na dodatek wszystko w ng-repeat?

Ja splodzilem cos takiego

<div ng-controller="indexController">
   <div ng-repeat="line in lines">
      <div class="preview" ng-if="display(line.id)">{{line.text}} {{$index}}</div>
   </div>
</div>
 
var module = angular.module('rxApp',[]);

function indexController($scope) {
    $scope.arr = [10,12]
    $scope.display = function(x) {
     for(i=0; i<$scope.arr.length; i++){
     	   if (x == $scope.arr[i]) {
            return true;
        } else {
            return false;
        }
     }
  };
    $scope.lines = [
    		{text: 'res1',id:10},
    		{text: 'res2',id:11},
        {text: 'res2',id:12}
        ];
}

Chodzi mi o to ze chce pojawiac pewne elmenty ktore sa w petli ng-repeat, a wyznacznikiem tego sa pewne cyfry, siedza one w tablicy. Jakis pomysl? ;p

0

Dla tych ktorzy by chcieli:

array.indexOf(line.id) > -1
0

Możesz napisać swój filtr, to by wyglądało mniej więcej tak:

Przykładowa definicja aplikacji AngularJS z controlerem i filtrem:

angular.module("Test", []).
controller("FilterExample", function($scope) {
  $scope.arr = [10,12];

  $scope.lines = [{
    		text: 'res1',
   	 	id: 10
  	}, {
    		text: 'res2',
    		id: 11
  	}, {
    		text: 'res3',
    		id: 12
  	}];
}).
filter('testFilter', function($filter){
    return function(list, arrayFilter, element){
        if(arrayFilter){
            return $filter("filter")(list, function(listItem){
                return arrayFilter.indexOf(listItem[element]) != -1;
            });
        }
    };
});

Użycie w HTML:

<div ng-repeat='line in lines | testFilter:arr:"id"'>
	<div class="preview">{{line.text}} {{$index}}</div>
</div>
0

Tak, wczoraj napisalem wlasnie podobny filtr, ale skorzystam z troche z Twojego. Kurcze, mam jeszcze jedno pytanie zwiazane z angularem. A mianowicie widzilem tutoriale autoryzacji uzytkownika przy uzyciu ciasteczek, moglbys mi powiedziec w jakim celu to sie stosuje? Przeciez ciasteczka mozna zmieniac, nie mozna po prostu pewne informacje przy pomocy $http pobrac i przypisac do obiektow angularowych? Wtedy przeciez nikt nie jest wstanie nam tego zmienic, a w ciasteczkach mozna grzebac, nie czaje tego troche.

0

Nie mozna po prostu po stronie backendu (np. php) zrobic sesje, jesli zrobimy $http.post('/login'), oczywiscie po wczesniejszym sprawdzeniu, czy uzytkownik istenieje i podal dobre haslo? I na koncu usuwac sesje dla $http.post('/logout') ? Tylko teraz zastanawiam sie jak zaladowac rozne informacje o stronie, dla uzytkownika ktory jest zalogowany, a dla tego ktory nie jest zalogowany.

Myslalem nad zwyklym $http.post na stronie, np. '/news', a pozniej w phpie jest sprawdzanie sesji uzytkownika, jesli istnieje to wykonuje operacje news dla zalogowanego, a jesli nie ma sesji to operacje news dla niezalogowanego. Jest to dobre rozwiazanie?

0

Mogłabym poszukać porównania, pomiędzy Cookie based i Token based auth. W projekcie, nad którym pracuję wybraliśmy tę drugą opcję.
W sessionStorage mamy token, który przez httpInterceptor jest dodawany do każdego requestu.

Zerknij na te linki:
https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
https://docs.angularjs.org/api/ng/service/$http

0

Dziekuje za linki. Bo troche nie rozumiem, dlaczego takie dane przechowuje sie w pamieci, zawsze myslalem ze to niebezpieczne.

0

W sessionStorage mamy token, który przez httpInterceptor jest dodawany do każdego requestu.
requesty tworzysz bezposrednio w httpInterceptor, czy po prostu tworzysz service/factory i tam wpychasz token bo backendu, a backend sprawdza zadanie, i w razie, np. (jesli ktos sobie podmienil cookie), to wysyla header 401? Bo troszke jeszcze nie ogarniam jak to ogarnac. Taki sposob moze byc prawidlowy?

0

Requesty tworzę w oddzielnych serwisach, a http interceptor do każdego requestu dodaje token w headers. Backend sprawdza token jak dostaje request.

0

Kurcze, niby rozumiem, ale nie bardzo rozumiem, jak backend ma dostac ten token, z headersow..

0

Np. tablica $_SERVER ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1