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

Sometimes $http status 0 but on django the status is 200

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

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

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

为了测试应用程序,我使用 Google Chrome(使用命令 --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。如果那是问题所在,其他工厂也无法运作,所以我认为这不是问题所在。其他一些答案说问题可能出在调用 'ver_plan''ver_entrenamiento' 的按钮上的 HTML,但两者都设置为 type="button",因此提交不是也不是问题。错误是随机发生的,我在事件流中找不到问题。有时,我什至会收到来自 Django 的 'broken pipe' 消息,但这也是随机发生的。

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

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

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

如果 $location.path(); 位于工厂调用中,则行 $window.location.reload(true); 不是必需的。例如:

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);

我希望我能给你更多关于问题原因的详细信息,但我的英语不够好。