【问题标题】:whats wrong in this $http request in angular?这个 $http 角度的请求有什么问题?
【发布时间】:2016-12-09 05:16:13
【问题描述】:

代码如下:

(function () {

angular.module('PillApp').factory('AuthFactory',
    ['$q', '$timeout', '$http', 'Flash', '$state',
        function ($q, $timeout, $http, Flash, $state) {

            // create user variable
            var user = null;
            // return available functions for use in the controllers
            return ({
                isLoggedIn: isLoggedIn,
                getUserStatus: getUserStatus,
                login: login,
                logout: logout,
                register: register
            });

            function isLoggedIn() {
                if(user) {
                    return true;
                } else {
                    return false;
                }
            }

            function getUserStatus(callback) {
                $http.get('/status/user')
                // handle success
                    .then(function (data) {
                        //console.log(JSON.stringify(data));
                        if(data.data !== ''){
                            user = true;
                            callback(user);
                        } else {
                            user = false;
                            callback(user);
                        }
                    });
            }

            function login(userProfile) {

                // create a new instance of deferred
                var deferred = $q.defer();

                console.log("Authentication Service - to send login to server");
                // send a post request to the server
                $http.post('/login',
                    userProfile)
                // handle success
                    .success(function (data, status) {
                        console.log("Authentication response received");
                        if(status == 200){
                            getUserStatus(function(result){
                                if(result){
                                    deferred.resolve();
                                    $state.go('A');
                                }else{
                                    deferred.reject();
                                    Flash.create('danger', "Ooops having issue logging in!", 0, {class: 'custom-class', id: 'custom-id'}, true);
                                    $state.go('A');
                                }
                            });
                        } else {
                            user = false;
                            Flash.clear();
                            Flash.create('danger', "Ooops having issue logging in!", 0, {class: 'custom-class', id: 'custom-id'}, true);
                            deferred.reject();
                        }
                    })
                    // handle error
                    .error(function (data) {
                        console.log("Authentication error - any flash messsage?");
                        user = false;
                        Flash.clear();
                        Flash.create('danger', "Ooops having issue logging in!", 0, {class: 'custom-class', id: 'custom-id'}, true);
                        deferred.reject();
                    });

                // return promise object
                return deferred.promise;
            }

            function logout() {

                // create a new instance of deferred
                var deferred = $q.defer();

                // send a get request to the server
                $http.get('/logout')
                // handle success
                    .success(function (data) {
                        user = false;
                        deferred.resolve();
                    })
                    // handle error
                    .error(function (data) {
                        user = false;
                        deferred.reject();
                    });

                // return promise object
                return deferred.promise;

            }

            function register(username, password) {

                // create a new instance of deferred
                var deferred = $q.defer();
                console.log("Sending registration to server");
                // send a post request to the server
                $http.post('/register',
                    {username: username, password: password})
                // handle success
                    .success(function (data, status) {
                        if(status){
                            console.log('Registration successful', data, status);
                            deferred.resolve();
                        } else {
                            console.log('Registration unsuccessful', data);
                            Flash.closeFlash();
                            Flash.create('danger', "Can't register with us!", 0, {class: 'custom-class', id: 'custom-id'}, true);
                            deferred.reject();
                        }
                    })
                    // handle error
                    .error(function (data) {
                        console.log('Registration error', data);
                        Flash.clear();
                        Flash.create('danger', "Ooops something went wrong!", 0, {class: 'custom-class', id: 'custom-id'}, true);
                        deferred.reject();
                    });

                // return promise object
                return deferred.promise;

            }

        }]);
})();

错误:

angular.js:14324 TypeError: $http.post(...).then is not a function
    at Object.login (http://ec2-52-77-252-229.ap-southeast-1.compute.amazonaws.com:3001/services/auth.factory.js:55:22)
    at AppCtrl.vm.login (http://ec2-52-77-252-229.ap-southeast-1.compute.amazonaws.com:3001/app.controller.js:35:25)
    at fn (eval at compile (http://ec2-52-77-252-229.ap-southeast-1.compute.amazonaws.com:3001/bower_components/angular/angular.min.js:236:285), <anonymous>:4:167)
    at e (http://ec2-52-77-252-229.ap-southeast-1.compute.amazonaws.com:3001/bower_components/angular/angular.min.js:281:195)

我也尝试了 $http.post().success,但它给出了错误,例如未定义成功

我也尝试过 $http.post().then 并且它给出的错误类似于 then is not defined

我以正确的方式注入了 $http。它在本地主机上工作,但在生产过程中它给出了这种错误。

【问题讨论】:

  • 您需要在此处显示您的完整控制器定义。此外,由于 $http 返回一个承诺,因此没有必要将该承诺包装在 deferred 中。
  • @Claies 所以我正在使用工厂,我现在附上了完整的代码

标签: angularjs http http-post


【解决方案1】:

您需要以这种方式定义包含http post指令的函数:

 $scope.getUserCallback = function (callback) {
            $http.get('/status/user')
            // handle success
                .then(function (data) {
                    //console.log(JSON.stringify(data));
                    if(data.data !== ''){
                        user = true;
                        callback(user);
                    } else {
                        user = false;
                        callback(user);
                    }
                });
        };

然后您可以在脚本内部根据需要调用它

$scope.getUserCallback();

从一个像这样的html元素

 <my element ng-click="getUserCallback()"></my element>

【讨论】:

  • 这不是我要找的。​​span>
  • 我认为你的代码是正确的,你需要检查你在get中使用的url
【解决方案2】:

我认为$http.post 调用因CORS 而失败。您可能需要启用CORS 或在您的请求中发送适当的HTTP 标头。您收到的错误是因为 $http.post 没有返回可以执行下一个 successthen 方法的预期对象。

它可以在您的 localhost 上正常工作,因为在本地开发环境中没有 CORS 限制。

【讨论】:

  • 如果$http 被正确注入控制器,它总是返回一个promise,即使promise 本身未能执行。 CORS 不会改变 $http 返回的内容。
猜你喜欢
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
相关资源
最近更新 更多