2015-05-24 69 views
0

我一直在努力解决这个问题现在一会儿。我一直在做一个离子+解析登录,注册,忘记密码的应用程序。这就是说Ionic是数据库的前端和parse.com。XMLHttpRequest失败:{statusText“:Not Found”,“status :: 404,”responseURL“:https://api.parse.com/1/users”Ionic + Parse

当从命令行使用Ionic服务器时,该功能可以在本地主机上完美工作,但是当我为android(离子建模android)或仿真(离散仿真android)构建应用程序或在android上测试它时设备我收到一系列错误消息:

当我尝试登录时;出现意外错误请重试

当我尝试重置密码时;发生意外错误,请重试

当我尝试,我出此错误信息进行注册:

XMLHttpRequest的失败:{状态文本“:未找到”,“状态:: 404” responseURL“:https://api.parse.com/1/users “,”response“:”“resp onseType”:“”。responseXML“:null,”responseText“:”“,”upload“:{loadend”:null,“onload”:null,“onprogress” “onloadstart”:NULL, “onloadend”:空,:的onload “:空” 的onerror “:空” onabort “:NULL}” withCredentials “:假” 的readyState “:4” 超时 “:0,” ontimeout” :空, “onprogress”:空, “onloadstart”:空,:onloadend “:空” 的onload “:空” 的onerror “:空,:onabort”:空}

这里是我的代码:

注册页面:模板文件夹

<ion-view title="Register"> 
    <ion-content has-header="true" has-tabs="true" padding="true"> 
     <div class="list"> 
      <label class="item item-input"> 
       <input type="email" ng-model="user.email" placeholder="Email"> 
      </label> 
      <label class="item item-input"> 
       <input type="password" ng-model="user.password" placeholder="Password"> 
      </label> 
      <label class="item item-input"> 
      <input type="text" ng-model="user.name" placeholder="First Name"> 
    </label> 
      <label class="item item-input item-stacked-label"> 
       <span class="input-label">Date of Birth</span> 
       <input type="date" ng-model="user.dob"> 
      </label> 
     </div> 
     <div class="assertive" ng-show="error.message">{{error.message}}</div> 
     <button class="button button-block button-stable" ng-click="register()"> 
      CREATE ACCOUNT 
     </button> 
     By creating an account you agree to the Terms of Use and Privacy Policy. 
    </ion-content> 
</ion-view> 

controllers.js

angular.module('ionicParseApp.controllers', []) 
.controller('AppController', function($scope, $state, $rootScope, $ionicHistory, $stateParams) { 
    if ($stateParams.clear) { 
     $ionicHistory.clearHistory(); 
     $ionicHistory.clearCache(); 
    } 
    $scope.logout = function() { 
     Parse.User.logOut(); 
     $rootScope.user = null; 
     $rootScope.isLoggedIn = false; 
     $state.go('welcome', { 
      clear: true 
     }); 
    }; 
}) 
.controller('WelcomeController', function($scope, $state, $rootScope, $ionicHistory, $stateParams) { 
    if ($stateParams.clear) { 
     $ionicHistory.clearHistory(); 
     $ionicHistory.clearCache(); 
    } 
    $scope.login = function() { 
     $state.go('app.login'); 
    }; 
    $scope.signUp = function() { 
     $state.go('app.register'); 
    }; 
    if ($rootScope.isLoggedIn) { 
     $state.go('app.home'); 
    } 
}) 
.controller('HomeController', function($scope, $state, $rootScope) { 
    if (!$rootScope.isLoggedIn) { 
     $state.go('welcome'); 
    } 
}) 
.controller('LoginController', function($scope, $state, $rootScope, $ionicLoading) { 
    $scope.user = { 
     username: null, 
     password: null 
    }; 
    $scope.error = {}; 
    $scope.login = function() { 
     $scope.loading = $ionicLoading.show({ 
      content: 'Logging in', 
      animation: 'fade-in', 
      showBackdrop: true, 
      maxWidth: 200, 
      showDelay: 0 
     }); 
     var user = $scope.user; 
     Parse.User.logIn(('' + user.username).toLowerCase(), user.password, { 
      success: function(user) { 
       $ionicLoading.hide(); 
       $rootScope.user = user; 
       $rootScope.isLoggedIn = true; 
       $state.go('app.home', { 
        clear: true 
       }); 
      }, 
      error: function(user, err) { 
       $ionicLoading.hide(); 
       // The login failed. Check error to see why. 
       if (err.code === 101) { 
        $scope.error.message = 'Invalid login credentials'; 
       } else { 
        $scope.error.message = 'An unexpected error has ' + 
         'occurred, please try again.'; 
       } 
       $scope.$apply(); 
      } 
     }); 
    }; 
    $scope.forgot = function() { 
     $state.go('app.forgot'); 
    }; 
}) 
.controller('ForgotPasswordController', function($scope, $state, $ionicLoading) { 
    $scope.user = {}; 
    $scope.error = {}; 
    $scope.state = { 
     success: false 
    }; 
    $scope.reset = function() { 
     $scope.loading = $ionicLoading.show({ 
      content: 'Sending', 
      animation: 'fade-in', 
      showBackdrop: true, 
      maxWidth: 200, 
      showDelay: 0 
     }); 
     Parse.User.requestPasswordReset($scope.user.email, { 
      success: function() { 
       // TODO: show success 
       $ionicLoading.hide(); 
       $scope.state.success = true; 
       $scope.$apply(); 
      }, 
      error: function(err) { 
       $ionicLoading.hide(); 
       if (err.code === 125) { 
        $scope.error.message = 'Email address does not exist'; 
       } else { 
        $scope.error.message = 'An unknown error has occurred, ' + 
         'please try again'; 
       } 
       $scope.$apply(); 
      } 
     }); 
    }; 
    $scope.login = function() { 
     $state.go('app.login'); 
    }; 
}) 
.controller('RegisterController', function($scope, $state, $ionicLoading, $rootScope) { 
    $scope.user = {}; 
    $scope.error = {}; 
    $scope.register = function() { 
     // TODO: add age verification step 
     $scope.loading = $ionicLoading.show({ 
      content: 'Sending', 
      animation: 'fade-in', 
      showBackdrop: true, 
      maxWidth: 200, 
      showDelay: 0 
     }); 
     var user = new Parse.User(); 
     user.set("username", $scope.user.email); 
     user.set("password", $scope.user.password); 
     user.set("email", $scope.user.email); 
     user.signUp(null, { 
      success: function(user) { 
       $ionicLoading.hide(); 
       $rootScope.user = user; 
       $rootScope.isLoggedIn = true; 
       $state.go('app.home', { 
        clear: true 
       }); 
      }, 
      error: function(user, error) { 
       $ionicLoading.hide(); 
       if (error.code === 125) { 
        $scope.error.message = 'Please specify a valid email ' + 
         'address'; 
       } else if (error.code === 202) { 
        $scope.error.message = 'The email address is already ' + 
         'registered'; 
       } else { 
        $scope.error.message = error.message; 
       } 
       $scope.$apply(); 
      } 
     }); 
    }; 
}) 
.controller('MainController', function($scope, $state, $rootScope, $stateParams, $ionicHistory) { 
    if ($stateParams.clear) { 
     $ionicHistory.clearHistory(); 
    } 
    $scope.rightButtons = [{ 
     type: 'button-positive', 
     content: '<i class="icon ion-navicon"></i>', 
     tap: function(e) { 
      $scope.sideMenuController.toggleRight(); 
     } 
    }]; 
    $scope.logout = function() { 
     Parse.User.logOut(); 
     $rootScope.user = null; 
     $rootScope.isLoggedIn = false; 
     $state.go('welcome', { 
      clear: true 
     }); 
    }; 
    $scope.toggleMenu = function() { 
     $scope.sideMenuController.toggleRight(); 
    }; 
}); 

apps.js

// setup an abstract state for the tabs directive 
      .state('welcome', { 
       url: '/welcome?clear', 
       templateUrl: 'templates/welcome.html', 
       controller: 'WelcomeController' 
      }) 

      .state('app', { 
       url: '/app?clear', 
       abstract: true, 
       templateUrl: 'templates/menu.html', 
       controller: 'AppController' 
      }) 

      .state('app.home', { 
       url: '/home', 
       views: { 
        'menuContent': { 
         templateUrl: 'templates/home.html', 
         controller: 'HomeController' 
        } 
       } 
      }) 

      .state('app.login', { 
       url: '/login', 
       views: { 
        'menuContent': { 
         templateUrl: 'templates/login.html', 
         controller: 'LoginController' 
        } 
       } 
      }) 

      .state('app.forgot', { 
       url: '/forgot', 
       views: { 
        'menuContent': { 
         templateUrl: 'templates/forgotPassword.html', 
         controller: 'ForgotPasswordController' 
        } 
       } 
      }) 

      .state('app.register', { 
       url: '/register', 
       views: { 
        'menuContent': { 
         templateUrl: 'templates/register.html', 
         controller: 'RegisterController' 
        } 
       } 
      }); 

     $urlRouterProvider.otherwise('/welcome'); 
    }) 
    .run(function ($state, $rootScope) { 
     Parse.initialize('**hidden**', '**hidden**'); 
     var currentUser = Parse.User.current(); 
     $rootScope.user = null; 
     $rootScope.isLoggedIn = false; 

     if (currentUser) { 
      $rootScope.user = currentUser; 
      $rootScope.isLoggedIn = true; 
      $state.go('app.home'); 
     } 
    }); 

回答

5

很可能导致你必须添加插件whitelist

cordova plugin add cordova-plugin-whitelist 

,如果你想引用保存到config.xml文件:在您的的config.xml文件

<access origin="*" /> 

cordova plugin add cordova-plugin-whitelist --save 

你应该有这个。如果您通过plugin的规格您将see您可以白名单您的域或外部域。
让它像这样意味着你可以列出所有的要求。

其中一些功能已由新的cordova版本引入。
更多信息here

如果你想查看究竟是什么导致你的应用程序的麻烦,我建议你通过USB插入你的android设备到你的电脑,激活调试功能,并使用Chrome作为检查员在您的浏览器中访问此chrome://inspect/#devices

您应该能够看到您的设备连接并调试它,就像使用标准Web应用程序一样。

+0

我从来没有在离子应用中使用白名单插件使用解析,这可能工作......但我不确定它是必需的。 –

+0

谢谢,它工作!最后我能够与外界沟通。 – user2993476

+0

@ user2993476:您应该接受答案,而不是用“谢谢”回答自己的问题。干杯。 – LeftyX