2016-01-17 4 views
1

Я использую AngularJS $ http.post для вызова PHP в моей логин-функции. PHP возвращает токен, а если не существует слова «ERROR».
PHP-код:

.... 
echo json_encode($token); 
} else { 
echo "ERROR"; 
} 


Controller.js:

var request = $http({ 
    method: "post", 
    url: constantService.url + 'login.php', 
    data, 
    headers: { 
     'Content-Type': 'application/x-www-form-urlencoded' 
    } 
    }); 

request.success(function(response) { 

    $localstorage.set("token", JSON.stringify(response)); 

    var showAlert = function() { 
     var alertPopup = $ionicPopup.alert({ 
      title: ' successful token-based login', 
      template: response 
     }); 
     alertPopup.then(function(res) { 
      console.log(res); 
      $state.go('home'); 
     }); 
    }; 
    showAlert(); 

    }); 

request.error(function(data, status, headers, config) { 

    console.log('An error occurred '); 

    var showAlert = function() { 
     var alertPopup = $ionicPopup.alert({ 
      title: 'Error', 
      template: 'check your login credentials' 
     }); 
     alertPopup.then(function(res) { 
     }); 
     }; 
     showAlert(); 
    }); 

Когда я получить обратно правильный маркер, что он работает без проблем. Когда я вернусь слово «ERROR» (маркер не существует) я получаю следующую ошибку в хромированных инспекторах:

**SyntaxError: Unexpected token E** 
at Object.parse (native) 
at fromJson  (http://localhost:8100/lib/ionic/js/ionic.bundle.js:9764:14) 
at defaultHttpResponseTransform (http://localhost:8100/lib/ionic/js/ionic.bundle.js:17278:16) 
at http://localhost:8100/lib/ionic/js/ionic.bundle.js:17363:12 
at forEach (http://localhost:8100/lib/ionic/js/ionic.bundle.js:9022:20) 
at transformData (http://localhost:8100/lib/ionic/js/ionic.bundle.js:17362:3) 
at transformResponse (http://localhost:8100/lib/ionic/js/ionic.bundle.js:18088:23) 
at processQueue (http://localhost:8100/lib/ionic/js/ionic.bundle.js:21888:27) 
at http://localhost:8100/lib/ionic/js/ionic.bundle.js:21904:27 
at Scope.$eval (http://localhost:8100/lib/ionic/js/ionic.bundle.js:23100:28) 

Что правильный способ вернуть слово «ERROR» хэндл это в моем ответ. ошибка-функция? Является ли это проблемой кодирования/декодирования JSON? Пробовал все, чтобы решить эту проблему, но безуспешно. THX.

+0

Ваш скрипт на стороне сервера должен будет вернуть код ошибки. Угловой не может знать, что ваша строка «ОШИБКА» является ошибкой, если указано, что запрос «200 OK». http://php.net/manual/en/function.http-response-code.php – JimL

+0

Следует также отметить, что методы '.success (successFunc)' и '.error (errorFunc)' устарели. Вы должны использовать метод '.then()', который может просто принимать эти функции в качестве аргументов; то есть «.then (successFunc, errorFunc)». Функции выставляют только одну переменную, но эта переменная является объектом с ключами 'data',' status', 'headers',' config' и 'statusText' точно такими же, как те, которые отображаются' .success() 'и' .error() '. – BobChao87

+0

ОК. Я понимаю. Как я могу заставить свой серверный скрипт возвращать код ошибки (или исправлять сообщение об ошибке), если токен не существует? Не могли бы вы привести здесь пример? thx –

ответ

2

По умолчанию угловой content-type является application/json. Я думаю, что ваше переопределение заголовка не работает, возможно, из-за данных перед отправлением заголовков.

var request = $http({ 
    method: "post", 
    url: constantService.url + 'login.php', 
    data : data, // here key : value pair is missing 
    headers: { 
     'Content-Type': 'application/x-www-form-urlencoded' 
    } 
    }); 

так угловато, что вы предоставляете ответ json и разбираете его как json. поэтому, когда ваш ответ ERROR просто пытается разобрать как json и метать ошибки разбора.

и про обратные вызовы. функция ошибки не будет запущена, пока не будет отправлен код ошибки или ошибка браузера. здесь приведены коды ошибок link

в вашем случае как ERROR, так и json_encode(token) будет запускать функцию успеха. поэтому вы должны обрабатывать функцию успеха также как функцию ошибки. вы могли бы сделать в вашем PHP файл

if(/*success condition */){ 
    $json = array('status'=>'success','token'=>$token); 
    }else{ 
    $json = array('status'=>'error','reason'=>'failed to generate token or somthing'); 
    } 
echo json_encode($json); 

и в функции успеха

request.success(function(response) { 
    if(response.status === 'success'){ 
    $localstorage.set("token", JSON.stringify(response)); 

    var showAlert = function() { 
     var alertPopup = $ionicPopup.alert({ 
      title: ' successful token-based login', 
      template: response 
     }); 
     alertPopup.then(function(res) { 
      console.log(res); 
      $state.go('home'); 
     }); 
    }; 
    showAlert(); 
}else{ 
    console.log(response.message);//you can do as you error function 
} 
    }); 

и не забудьте удалить заголовки настройки, если она не нужна. или если вам это нужно, выполните JSON.parse(response) в верхней части функции успеха.

+0

@ фишерманн. большое спасибо. Это была проблема. Я сделал ваше предложение, и он отлично работает. Ты спас свой день. –

+0

добро пожаловать @ RalfBordé – Fisherman

Смежные вопросы