AngularJS 'Невозможно прочитать свойство' then 'of undefined'

У меня эта проблема, когда я нажимаю кнопку входа в систему, хром-консоль регистрирует это:

angular.min.js: 117 TypeError: Невозможно прочитать свойство «then» неопределенного значения в m. $ scope.logIn (loginModuleController.js: 11)

Обслуживание:

angular.module('loginModule') .factory('loginService', function($http){ return{ login: function(username, password){ var session; $http.post('../server/php/auth/auth.php', { username: username, password: password }) .then(function(res){ session = res; }); return session; }, isLogged: function(){ return $http.get('../angCMS/server/php/auth.php?is_logged=true'); }, logOut: function(){ return $http.get('../angCMS/server/php/auth.php?logout=true'); } }; }); 

контроллер:

 angular.module('loginModule') .controller('LoginCtrl', ['$scope', 'loginService', function($scope, loginService){ $scope.auth = false; $scope.username; $scope.password; $scope.logIn = function(){ loginService.login($scope.username, $scope.password).then(function(response){ }, function(res){ }); }; $scope.isLogged = function(){ loginService.isLogged() .then(function(response){ if(response){ $scope.auth = true; } }); }; $scope.logOut = function(){ loginService.logOut() .then(function(response){ if(response){ $scope.auth = false; } }); }; }]); 

и это шаблон html:

 <div class="container" ng-if="auth==false"> <div class="col-md-4 col-md-offset-4"> <div class="row"> <br/><h2 align="center">Login</h2> </div> <div class="well"> <form class="form-horizontal"> <fieldset> <div class="form-group"> <input type="text" class="form-control" placeholder="Username" ng-model="username" required> </div> <div class="form-group"> <input type="password" class="form-control" placeholder="Password" ng-model="password" required> </div> <div class="form-group"> <button class="btn btn-md btn-primary btn-block" type="submit" ng-click="logIn()">Sign in</button> </div> </fieldset> </div> </form> </div> </div> 

Метод входа в PHP:

 public function login($user, $pass){ $user = htmlspecialchars(trim($user)); $pass = md5(htmlspecialchars(trim($pass))); $res = $this->DB->prepare("SELECT * FROM `admin` WHERE username = :user"); if(!$res->execute(Array(":user"=>$user))) die(mysql_error()); $row = $res->fetch(PDO::FETCH_ASSOC); if(!$row['password'] == $pass) die("Errore: password errata!"); $_SESSION['logged'] = $row; array_push($session, $_SESSION['logged'], true); return $session; } 

Это скорее злоупотребление обещаниями.

Вы можете сначала взглянуть на то, как работают обещания:

Из вашего кода обслуживания:

 login: function(username, password){ var session; $http.post('../server/php/auth/auth.php', { username: username, password: password }) .then(function(res){ session = res; }); return session; } 

Когда вызывается login(username, password) , сеанс по-прежнему undefined по возвращении.

Это связано с тем, что $http.post() является асинхронной функцией, предложение .then() не выполняется сразу же.

Как указано в ответе Snixtor , вы должны «вернуть возвращаемое значение $http.post() »:

 login: function(username, password){ return $http.post('../server/php/auth/auth.php', { username: username, password: password }); } 

Затем, ссылаясь на метод login вашего контроллера:

 $scope.logIn = function(){ loginService.login($scope.username, $scope.password).then(function(response){ // response === 'session' }, function(res){ }); }; 

параметр response из loginService.login().then() – это точно значение вашей предполагаемой переменной session из вашей предыдущей реализации.

Функция login сервисную функцию не возвращает обещание, созданное вызовом $http.post . Вместо этого вам нужно:

 login: function(username, password){ return $http.post('../server/php/auth/auth.php', { username: username, password: password }); } 

Заметьте также, что я удалил переменную session из этой функции. Это then функция вашего контроллера, которая должна иметь дело с ответом.

Ваши функции isLogged и logOut выглядят хорошо. Просто повторите эту схему.

Вы возвращаете непризнанную переменную с именем «session». Итак, то, что вы делаете здесь, в вашем зарегистрированном методе возвращается неопределенным. Undefined не имеет метода, называемого then.

 login: function(username, password){ var session; $http.post('../server/php/auth/auth.php', { username: username, password: password }) .then(function(res){ session = res; }); return session; }, 

Я предполагаю, что вы действительно хотите вернуть метод $ http.post, который, в свою очередь, возвращает обещание. Таким образом, вы можете использовать сеанс в контроллере?