【问题标题】:Success callback in $http promise isn't happening$http 承诺中的成功回调没有发生
【发布时间】:2015-03-11 16:52:17
【问题描述】:

我正在做一个使用 RESTful API 的 Angular 应用程序。我正在以这种方式处理用户的身份验证:

// in services.js

app.factory('authService', ['$http', '$q', 'localStorageService', 
  function ($http, $q, localStorageService) {

    var login = function (loginData) {

      var data = "grant_type=something&username=" + loginData.userName + "&password=" + loginData.password;
      var deferred = $q.defer();

      $http.post(serviceBase + 'token', data).
        success(function (response) {
          localStorageService.set('authorizationData', { token: response.access_token });
          localStorageService.set('personaData', { username: response.username });

          deferred.resolve(response);
        }).
        error(function(err, status) {
          deferred.reject(err);
        });

      return deferred.promise;

    };

还有控制器

// controller.js

app.controller('LoginCtrl', ['$scope', '$state', 'authService',
  function ($scope, $state, authService) {
    $scope.loginData = {
      userName: '',
      password: ''
    };

    $scope.alert = {type: '',msg: ''};

    $scope.login = function () {
      authService.login($scope.loginData).
        then(function (response) {
          $state.go('index'); // when the service verify that the auth data is correct, the controller redirects to the principal state 
        }, function (err) {
          $scope.alert = {
            type: 'danger',
            msg: 'non'
          };
        });
    };
  }
]);

问题是当用户发送正确的身份验证信息(即用户名和密码)时,当响应为 200 OK 时,服务没有经过.success 回调。是的,只有当响应不是 200 OK 时才会出现这种行为。

资源的确切响应是:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 851
Content-Type: application/json;charset=UTF-8
Expires: -1
Server: Microsoft-IIS/8.5
X-Powered-By: ASP.NET
Date: Wed, 11 Mar 2015 16:20:12 GMT

{"access_token":"...","token_type":"...","expires_in":"...","username":"...","role":"...","display_name":"..."}

这里发生了什么?我该如何解决这个问题?谢谢。

【问题讨论】:

  • 如果你没有成功,你至少会出错吗?
  • @KevinB 是的,当 auth 数据错误时,响应为 400 Bad Request,服务按预期运行。
  • 对,但是当它是正确的,而你没有得到成功时,你至少会出错吗?
  • 在这种情况下,角度报告什么状态代码?我知道你已经看过网络选项卡,我想看看 Angular 看到了什么。可能一直以来您都遇到了 CORS 错误,只是没有看到它们,并假设您收到错误凭据的“错误”是由于凭据错误而不是 CORS。
  • @KevinB 我已经检查过 CORS,不是吗。对于错误的身份验证信息,角度报告确切的状态代码。对于正确的身份验证信息,Angular 不会报告任何内容。

标签: javascript angularjs


【解决方案1】:

您不需要创建新的承诺,只需从 $http 调用中返回承诺 - 我认为您对 localStorageService 的调用中发生了异常,但它会丢失并且您的承诺永远不会得到解决。您可以将您的 authService 更改为以下内容,希望您会在 localStorageService 中看到错误:

app.factory('authService', ['$http', '$q', 'localStorageService', 
  function ($http, $q, localStorageService) {

  var login = function (loginData) {

    var data = "grant_type=something&username=" + loginData.userName + "&password=" + loginData.password;

    return $http.post(serviceBase + 'token', data).
      success(function (response) {
        localStorageService.set('authorizationData', { token: response.access_token });
        localStorageService.set('personaData', { username: response.username });

        return response;
    });
  };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多