有时$ http状态为0但在django上状态为200

时间:2015-12-24 07:19:19

标签: android angularjs django cordova ionic

首先,抱歉我的英语;我不是母语人士。

其次,我正在使用Ionic框架为Android制作应用程序,我正在使用Django作为REST API。

我遇到了工厂问题:Django中请求的HTTP状态为200,数据库注册了更改,但在应用程序中HTTP状态为0.这只发生在包含两个POST请求的工厂中。在其他工厂发出的其他POST请求工作正常。

要测试应用,我使用谷歌浏览器(使用命令--disable-web-security),Ionic版本1.5.0,Django版本1.8.2,Cordova版本5.0(我找不到哪个版本的AngularJS我是使用)。我在几个移动设备上遇到了同样的问题。

以下是导致问题的3个控制器:

.controller('PlanesCtrl', function($scope, $ionicModal, $ionicPopup,$location, Planes, $window) {   

$scope.planes = JSON.parse($window.localStorage['planes']);
$scope.usuario = JSON.parse($window.localStorage['user']);
        var usuario_id = {
            codusuario: $scope.usuario["codusuario"]
        };
$scope.mascotaEscogida = JSON.parse($window.localStorage['mascotaEscogida']);
        var especie_id = {
            codespecie: $scope.mascotaEscogida.codespecie
        };
        var mascota_id = {
            codmascota: $scope.mascotaEscogida.id
        };
        var data = {
            codespecie: $scope.mascotaEscogida.codespecie,
            codmascota: $scope.mascotaEscogida.id
        }

$scope.ver_plan = function(plan){
    Planes.selectChosenPlan(plan.id);
    if (plan.suscrito == 0){
        $location.path("/app/planes/" + plan.id); 
    }
    else{
        $location.path("/app/entrenar/" + plan.id);  
    }
};
})

.controller('PlanCtrl', function($scope, $ionicModal,$location, $ionicPopup, $window, Planes) { 
$scope.mascotaEscogida = JSON.parse($window.localStorage['mascotaEscogida']);

var mascota_id = {
            codmascota: $scope.mascotaEscogida.codmascota
        };
$scope.plan = JSON.parse($window.localStorage['planActual']);

var data = {
            codplan: $scope.plan.id,
            codespecie: $scope.mascotaEscogida.codespecie,
            codmascota: $scope.mascotaEscogida.id
        };

$scope.suscribir = function(){
  var data = {
            codplan: $scope.plan.id,
            codespecie: $scope.mascotaEscogida.codespecie,
            codmascota: $scope.mascotaEscogida.id
        };
console.log($scope.plan.id);
console.log($scope.mascotaEscogida.codespecie);
console.log($scope.mascotaEscogida.id);
Planes.suscribir(data, function() {
        alert("Su mascota ha sido suscrita al plan con éxito");
        } , function() {
        } , function() {
            console.log("No funciona suscribir en funcion suscribir, PlanCtrl");
        });
Planes.buscar(data, function() {
        } , function() {
        } , function() {
            console.log("No funciona buscar en funcion suscribir, PlanCtrl");
        });
$location.path("/app/pet/" + mascota_id);
$window.location.reload(true);
};
})

.controller('PetCtrl', function($scope, $stateParams, $filter, $location, Mascota, Planes, $window, $ionicModal) {

$scope.mascotaEscogida = JSON.parse($window.localStorage['mascotaEscogida']);
$scope.usuario_logged = JSON.parse($window.localStorage['user_data']);
$scope.usuario_info = JSON.parse($window.localStorage['user']);
        var data = {
            codespecie: $scope.mascotaEscogida.codespecie,
            codmascota: $scope.mascotaEscogida.id
        }

$scope.ver_entrenamientos = function(mascota){
Planes.buscar(data, function() {
        alert("Planes encontrados con exito");
        } , function() {
            alert("La mascotas no posee especie registrada (esto es muy extraño)");
        } , function() {
            console.log("No funciona buscar en ver_entrenamientos, PetCtrl");   
        });
$location.path("/app/planes");
$window.location.reload(true);
};

if($scope.usuario_logged === false) {
    $location.path('/login');
}

else {

  $scope.test = function() {
    fecha_hora = $filter('date')(new Date(), 'yyyy-MM-dd HH:mm:ss', '-0300');
    var info = {
      fecha: fecha_hora,
      codmascota: $scope.mascotaEscogida.id,
      codusuario: $scope.usuario_info.codusuario
    }
  Mascota.alimentar(info, function() {
    alert("La mascota ha sido alimentada con exito :)");
  } , function() {
    alert("Lo sentimos, algo ha ocurrido y no podemos registrar la alimentación");
  } , function() {
    alert("Verifica la conexión a internet");
  });
}
}

})

这是工厂:

 .factory("Planes", function($http, $window){
    var url = "http://localhost:8000/plan/";

    var currentPlanes = function(data){
        $window.localStorage['planes'] = JSON.stringify(data);    
    };

    return {

        selectChosenPlan: function(id) {
            var arregloPlanes = JSON.parse($window.localStorage['planes']);
            for (var i = 0; i <= arregloPlanes.length - 1; i++) {
                if (parseInt(arregloPlanes[i].id) == id) {
                    $window.localStorage['planActual'] = JSON.stringify(arregloPlanes[i]);
                }
            }
        },

        buscar: function(inf, successFunction, errorFunction, connectionError) {
            $http({ 
                method: 'POST',
                url: url + 'planes/',
                headers: {'Content-Type': 'application/json'},
                data: JSON.stringify(inf),
                timeout: 20000 
            }).then(function successCallback(response) {
                if (response.data.length > 0) {
                    console.log("buscar" + response.data[0]);
                    currentPlanes(response.data);
                    successFunction();
                }
                else{ 
                    currentPlanes(response.data);
                    errorFunction();
                }
            }, function errorCallback(response) {
                connectionError();
            });
        },


        suscribir: function(inf, successFunction, errorFunction, connectionError) {
            $http({ 
                method: 'POST',
                url: url + 'suscribir/',
                headers: {'Content-Type': 'application/json'},
                data: JSON.stringify(inf),
                timeout: 20000 
            }).then(function successCallback(response) {
                if (response.data.length > 0) {
                    console.log("suscribir" + response.data[0]);
                    currentPlanes(response.data);
                    successFunction();
                }
                else{ 
                    currentPlanes(response.data);
                    errorFunction();
                }
            }, function errorCallback(response) {
                connectionError();
            });
        }
    };    
})

我在互联网上做了一些研究,但我发现的所有解决方案都指向了CORS。如果这是问题,另一家工厂也不会工作,所以我不认为这是问题所在。其他一些答案表示问题可能出现在HTML中,调用'ver_plan''ver_entrenamiento'的按钮上,但两者都设置为type="button",因此提交不是问题。错误随机发生,我无法在事件流中找到问题。有时,我甚至从Django收到'broken pipe'消息,但这也是随机发生的。

我知道JSON答案有效且格式正确;我没有想法,我需要解决这些问题。

编辑:此外,当我遇到问题时,行console.log("No funciona buscar en funcion suscribir, PlanCtrl");不会出现在控制台中。

1 个答案:

答案 0 :(得分:0)

几个星期前我找到了答案。问题是 $window.location.reload(true);$location.path();

如果$window.location.reload(true);位于工厂调用内,则行$location.path();没有必要。例如:

Planes.buscar(data, function() {
    $location.path("/app/pet/" + mascota_id);
    } , function() {
    } , function() {
        console.log("No funciona buscar en funcion suscribir, PlanCtrl");
    });

这样,只有当服务器的答案成功并且不需要使用$window.location.reload(true);

时才会发生重定向

我希望我能为您提供有关问题原因的详细信息,但我的英语不够好。