2016-08-25 4 views
0

Ich habe Probleme mit AngularJS und Zugriff auf verbundene Benutzerinformationen hier. Mein Ziel ist es, die Informationen des verbundenen Nutzers in einem Service zu speichern, damit dieser in der ganzen App verfügbar ist. Also das ist, wie ich es tun:AngularJS: Zugriff auf verbundene Benutzerinformationen vom Controller

Die Login-Funktion über einen Login-Dienst ausgesetzt ist, und sein Code ist folgend:

(function(){ 
var $loginService = angular.module("RockMyTask.LoginService", [ 
    "satellizer", 
    "RockMyTask.ApiService" 
]); 

/** 
* Login service 
* 
* function login(identifier, password, after) 
* Logs the given user. Global data about the user are registered in the root scope. 
* @param identifier The user's identifier (either email or password) 
* @param password The user's password 
* @param success (optional) A callback to execute when the user is successfully logged in. This callback is passed 
* the response object. 
* @param failure (optional) A callback to execute when the log in fails. This callback is passed the response 
* object. 
* 
* function restore() 
* If the user was already logged in, restore the user data in the rootScope. 
* 
* function connectedUser() 
* Return the data of the currently connected user. If the user is not connected an empty object is returned. 
* If the user data hasn't be fetched yet, then an empty object is returned and this object will be filled with 
* the user data as soon as it is received. 
*/ 
$loginService.factory("Login", ["$auth", "$rootScope", "User", 
    function($auth, $rootScope, User) { 
    var obj = {}; 
    var connectedUser = {}; 

    obj.logout = function() { 
     $auth.logout(); 
     //Authorization.clear(); 
     connectedUser = null; 
    }; 

    obj.login = function(identifier, password, success, failure) { 
     var credentials = { 
      user_identifier: identifier, 
      password: password 
     }; 

     $auth.login(credentials).then(function(auth_response) { 
      // fetch user data (with both spectator and rockstar flags set to true) 
      User.me(true, true).then(function(response) { 
       connectedUser = response.data; 
       //TODO add check for DEBUG_MODE 
       console.log("Received connected user data and stored it in connectedUser var"); 
      }, function() { 
       connectedUser = {}; 
      }); 

      // execute provided success callback 
      if (_.isFunction(success)) { 
       success(auth_response); 
      } 
     }, function(response) { 
      connectedUser = null; 

      // execute provided failure callback 
      if (_.isFunction(failure)) { 
       failure(response); 
      } 
     }); 
    }; 

    obj.restore = function() { 
     if ($auth.isAuthenticated()) { 
      User.me(true, true).then(function(response) { 
       connectedUser = response.data; 
      }, function() { 
       connectedUser = null; 
      }); 
     } else { 
      connectedUser = null; 
     } 
    }; 

    obj.getConnectedUser = function(){ 
     if($auth.isAuthenticated && !connectedUser){ 
      User.me(true, true).then(function(response) { 
       connectedUser = response.data; 
      }, function() { 
       connectedUser = null; 
      }); 
     } 
     return connectedUser; 
    }; 

    obj.updateUserInfo = function(user){ 
     connectedUser = user; 
    }; 

    obj.isConnectedUserRockstar = function(){ 
     return connectedUser.rocker != null; 
    }; 
    obj.isConnectedUserSpectator = function(){ 
     return connectedUser.spectator != null; 
    }; 

    return obj; 
}]); 
})(); 

Wie Sie im Code, nach dem erfolgreichen Login beobachten können ich starten eine HTTP-Anforderung (User.me(true, ture)), die die zurückgegebenen Daten (die Informationen über den verbundenen Benutzer darstellen) in einer Ad-hoc-Variablen des Dienstes connectedUser speichert.

an die angeschlossenen Benutzern Informationen von jedem beliebigen Punkt der Anwendung zuzugreifen, ich eine Funktion im Login-Dienst implementiert habe getConnectedUser genannt, dessen Code wird hier berichtet:

obj.getConnectedUser = function(){ 
     if($auth.isAuthenticated && !connectedUser){ 
      User.me(true, true).then(function(response) { 
       connectedUser = response.data; 
      }, function() { 
       connectedUser = null; 
      }); 
     } 
     return connectedUser; 
    }; 

Diese prüft dann funktionieren, wenn der Benutzer tatsächlich authentifiziert und wenn die Variable connectedUser bereits korrekt gefüllt wurde und wenn nicht, löst sie erneut die HTTP-Funktion zum Abrufen der Daten aus (andernfalls gibt sie einfach die connectedUser var zurück).

Jetzt ist mein Problem das folgende. Die Seite, auf die ich den Benutzer umlenke, verwendet nach erfolgreichem Login einen Controller, an den ich den Login Service übergeben habe. Der Controller versucht, die verbundenen Benutzerinformationen abzurufen, aber das Ergebnis ist ein Nullzeiger. Was mache ich falsch??

Der Code in der Steuerung (nur für den Fall, selbst wenn sehr einfach):

$scope.user = Login.getConnectedUser(); 

EDIT 1 im Browser an der Konsole Blick sehe ich, dass die HTTP-Anforderung Erfolg hat und die zurückgegebenen Daten ist:

{"id":3,"email":"[email protected]","name":"Michele","surname":"Imperiali","locale":"it_IT","picture":"https:\/\/storage.rockmytask.it\/users\/profile_image\/3.jpeg","birthday":"1982-06-23","gender":"M","country":"IT","province":"Lombardia","city":"Milano","zip":"20100","street":"190 Grover Expressway","mobile_phone":"(437)924-8282","home_phone":"239-250-3166x783","username":"spectator","validated":true,"timezone":"Europe\/Rome","created_at":"2016-04-01T12:50:53+0000","rocker":null,"spectator":{"description":"I need help with my garden !"}} 

Wie bereits erwähnt, wenn ich auf die Variablen der $scope.user in der Steuerung erhalte ich eine null-Zeiger-Ausnahme zuzugreifen versuchen.

+0

Können Sie bestätigen, dass Sie die richtigen Daten in 'User.me (true, ture)' durch consol.logging haben? –

+0

@JahongirRahmonov ja ich kann. Ich habe weitere Details in der Frage hinzugefügt – miks87

+0

Können Sie vollständigen Login-Service-Code buchen? –

Antwort

-1

ich glaube, das Problem mit dem auf null

, function() { 
      connectedUser = null; 
     } 

Gibt es einen Grund, warum Sie connectedUser setzen zu tun hat? Wenn der Grund ist, weil Sie es auf null gesetzt werden soll, wenn Sie einen Fehler aus dem Backend oder eine schlechte Rendite erhalten dann tun:

obj.getConnectedUser = function(){ 
    if($auth.isAuthenticated && !connectedUser){ 
     User.me(true, true).then(function(response) { 
      connectedUser = response.data; 
     }, function(error) { 
      connectedUser = null; 
     }); 
    } 
    return connectedUser; 
}; 

Diese dann würde connectUser nur auf null gesetzt, wenn Sie eine schlechte Antwort erhalten, wie Von jetzt an sieht es so aus, als ob der connectedUser immer auf Null gesetzt wird und Ihren Nullzeiger erklärt.

+0

Danke Jeffrey, aber ich denke nicht, dass deine Lösung gut ist. Die Notation für die "then" -Funktion besteht darin, die beiden Funktionen für Erfolg und Misserfolg zu definieren. Meine Funktion als zweiter Parameter wird nur bei Ausfall der HTTP-Anfrage ausgelöst. In der Tat, auch wenn ich den 'connectedUser = null'-Text kommentiere, ist das Problem immer noch das gleiche ... – miks87

+1

Sorry, ich hatte noch nicht genügend Reputation, um zu kommentieren. Mein anderer Gedanke wäre die Funktion sollte eigentlich das Versprechen zurückgeben, anstatt auf das Versprechen innerhalb der Funktion zu warten. Sie müssten also die Funktion http-Anfrage zurückgeben. dann in der Steuerung Login.getConnectedUser() sein, dann (function (response) {$ scope.user = response.data}); –

+0

Hey Jeffrey, ja du hast Recht. Ich mache das nicht wie du sagtest, weil ich das dann im Dienst ausführen möchte, um dort die connectedUser-Info zu speichern und sie für nachfolgende Anfragen von anderen Teilen der Anwendung verfügbar zu machen. Dein Kommentar hat mich jedoch in die richtige Richtung gelenkt. Ich werde meine Lösung in Kürze veröffentlichen. Prost! – miks87

Verwandte Themen