У меня эта проблема, когда я нажимаю кнопку входа в систему, хром-консоль регистрирует это:
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, который, в свою очередь, возвращает обещание. Таким образом, вы можете использовать сеанс в контроллере?