Контроллер не регистрирует ответ от Nodejs с помощью службы Angular $http

Я создал форму и щелкнул по форме, я хочу увидеть ответ от сервера (nosejs). В Angular Controller я вызываю службу. Ответ виден при вызове из самой службы, но при вызове из контроллера ничего не появляется.

Контроллер:

MyApp.angular.controller("loginCtrl", function($scope, UserService){
    $scope.name = "TestName";

    $scope.check = function(user){

        UserService.createUser(user, function(response){
            $scope.userinfo = response;
            console.log("FROM Ctrlr: " + response);
        });
    }

});

Сервис:

MyApp.angular.factory("UserService", function($http,$location){

        var service = {
            createUser: createUser
        };

        return service;

        function createUser(user){
            $http.post("/register", user).then(function(response){

            console.log("FROM Srvc:" +response);
            });
        }
});

NodeJS:

app.post("/register", function(req, res){
    var user = req.body;
res.json(user);
});

Я могу увидеть ответ, записанный в консоль, если я вызову его из службы. Но нет ответа при вызове из самого контроллера. Причина включения MyApp.angular.factory и MyApp.angular.controller заключается в том, что я объявил MyApp в другом файле конфигурации.

Что я делаю не так?


person Somename    schedule 08.03.2017    source источник
comment
UserService.createUser ничего не возвращает и не получает обратного вызова для обработки. Как вы можете ожидать объект response в своем контроллере, если вы его каким-то образом не вернули?   -  person Emin Laletovic    schedule 09.03.2017
comment
Не обижайтесь, брат/сестра, но, возможно, прежде чем углубляться в такие фреймворки, как Angular, вы, возможно, захотите сначала ознакомиться с языком JavaScript в целом. При этом, если вам абсолютно необходимо/хотите начать копаться в Angular, найдите хороший пример проекта, который охватывает интересующие вас темы, и подражайте тому, что они делают, пока не поймете, что происходит.   -  person Pytth    schedule 09.03.2017
comment
@Питт, спасибо. Чтобы изучить JS в целом, потребуется много времени. Но спасибо. Я узнал об обещаниях Angular и о причине этого вопроса. Но спасибо. Я понимаю что ты имеешь ввиду.   -  person Somename    schedule 09.03.2017


Ответы (3)


В отличие от node.js, который использует API-интерфейсы на основе обратного вызова, платформа AngularJS использует API-интерфейсы на основе обещаний. Верните обещание и используйте его метод .then:

Контроллер

app.controller("loginCtrl", function($scope, UserService){
    $scope.name = "TestName";

    $scope.check = function(user){

        //UserService.createUser(user, function(response){
        //USE .then method
        return UserService.createUser(user).then(function(data) {
            $scope.userinfo = data;
            console.log("FROM Ctrlr: " + data);
            return data;
        }).catch(function(errorResponse) {
            console.log(errorResponse.status);
            throw errorResponse;
        });
    }

});

обслуживание

    function createUser(user){
        var promise = $http.post("/register", user).then(function(response){
            var data = response.data;
            console.log("FROM Srvc:" +data);
            //RETURN data to chain
            return data;
        });
        //RETURN promise
        return promise;
    }

Не преобразовывайте API-интерфейсы на основе обещаний в API-интерфейсы обратного вызова. Это считается анти-шаблоном.

См. Почему обратные вызовы из методов Promise .then являются анти-шаблоном .

person georgeawg    schedule 09.03.2017

Чтобы получить ответ в вашем контроллере с завода, измените функцию createUser на вашем заводе следующим образом:

function createUser(user){
            //notice the return here!!!
            return $http.post("/register", user).then(function(response){

            console.log("FROM Srvc:" +response);
            return response.data; //notice the return here too!!!
            });
        }

Вам нужно вернуть обещание внутри функции, а внутри then также вернуть результат, чтобы получить к нему доступ из любого места, где вы вызываете функцию.

person lealceldeiro    schedule 08.03.2017

Вам нужно добавить еще 1 параметр, обратный вызов и вернуть ответ функции обратного вызова

 function createUser(user, callback){
        $http.post("/register", user).then(function(response){

        console.log("FROM Srvc:" +response);

         callback(response);  // return the response in the callback function
        });
 }
person digit    schedule 08.03.2017
comment
почему мой ответ получил отрицательный голос. Эй, даунвотер, покажись - person digit; 09.03.2017
comment
Не преобразовывайте API-интерфейсы на основе обещаний в API-интерфейсы обратного вызова. Это считается анти-шаблоном. См. Почему обратные вызовы из методов Promise .then являются анти-шаблоном. . - person georgeawg; 10.03.2017