angularjs - Fangst av 403-feil i Angular og vise en popup


På nettstedet vårt havner jeg i denne situasjonen hvor du i praksis overfører et prosjekt til en annen bruker. Når det skjer, hvis den opprinnelige brukeren prøver å se prosjektet han/hun nettopp har overført, gir vi tilbake en 403 fordi de ikke lenger er eieren av prosjektet. Jeg begynte å se på interceptors i Angular. Jeg koblet responseError til bare for å se om det blir kalt på 403 som dette

.config(($httpProvider) => {
        $httpProvider.interceptors.push(function() {
            return {
                responseError: function(rejection) {
                    console.log("bad response");
                    return rejection;
                }
            }
        });
    });

Så min "dårlige respons" blir kalt og alt, men jeg var ikke sikker på hvordan jeg kunne vise et modalt vindu eller noe på dette tidspunktet som viser feilen til brukeren siden denne 403-responsen faktisk skjer på noen av våre forskjellige ressurser, ikke bare prosjekter.

Svar #1

Hvis jeg forstår riktig, vil du vise feildialogen bare for noen HTTP-kall, ikke hvert kall som går gjennom din interceptor. Du kan sannsynligvis prøve dette:-

Sett en konfigurasjon for dine HTTP-kall, for eksempel handleError:true.

$http.get('myurl', {handleError:true})....


$http.post('myurl',data, {handleError:true})....

osv..

og i din interceptor se etter den spesifikke konfigurasjonsinnstillingen for å vise feilen:-

   $httpProvider.interceptors.push(function() {
        return {
            responseError: function(rejection) {
                console.log("bad response");
                if(rejection.config.handleError && rejection.status === 403){
                    //show error dialog
                }
                return rejection;
            }
        }
    });

Du kunne også muligens sende statuskoden som må håndteres.

 $http.get('myurl', {handleStatus:[403,...]})....

og

  $httpProvider.interceptors.push(function() {
        return {
            responseError: function(rejection) {
                if((rejection.config.handleStatus || []).indexOf(rejection.status) > -1){
                    //show error dialog. probably you could show it in a $timeout to make this async.
                }
                return rejection;
            }
        }
    });

Relaterte artikler