在创建工厂服务时,返回$ http.post究竟是什么意思?

时间:2015-12-16 18:44:40

标签: javascript angularjs express

所以我一直试图理解:return $http.post('/some link')的含义,但我无法完全理解它。

假设我有一个节点/表达后端,我正在使用angular作为我的前端。我的api中的一个功能是:

 var api = express.Router();
 //other code

api.post('/login', function(req,res) {
        User.findOne({username:req.body.username})
            .select('password').exec(function(err, user) {
            if (err) {
                res.send(err);
                return;
            } else {
                if (!user) {
                    res.json({message: 'user does not exist!'});
                } else {
                    var validPassword = user.comparePassword(req.body.password);
                    if (!validPassword) {
                        res.json({message: 'invalid password!'});
                    } else {
                        var token = createToken(user);

                        res.json({
                            success: true,
                            message: "successfully logged in",
                            token: token
                        });                    
                    }
                }
            }
        })
    });

然后我创建一个角度工厂服务来从后端获取数据:

var authService = angular.module('authService', {});


authService.factory('Auth', function($http, $q) {  
    var authFactory = {};


    //authToken: factory which has methods to get and set token
    authFactory.login = function(username, password, authToken) {

        return $http.post('/login', {
            username: username,
            password: password
        })   
        .then(function(err, data) {
            if (err) {
                console.log(err);
            } else {
                AuthToken.setToken(data.token);
                return data;
            }
        })
    }
});

通常,POST方法将数据放入后端,它不会返回任何内容,但由于$ http.post返回一个promise对象,因此我们将返回此对象。在我的例子中,这个对象是这样的:

 res.json({
                            success: true,
                            message: "successfully logged in",
                            token: token
                        });    

我的问题是:我的思路是否正确?我一直在阅读并重新阅读有关此的角度文档,虽然它提供了一些缓解,但我不能帮助,但我认为我在这里遗漏了一些东西。

1 个答案:

答案 0 :(得分:1)

http.post返回一个承诺。 then方法最多可以包含2个参数,resolve处理程序或rejection处理程序。每个处理程序只占用一个参数。所以在你的例子中:

return $http.post('/login', {
      username: username,
      password: password
}).then(function(err, data){});

这实际上是错的。您的resolve处理程序应该只接受1个参数(正在接收data)。如果出现错误,则需要使用第二个参数。

.then(function(data) { /*resolved*/ }, function(err) { /*something happened*/ });

虽然使用catch

会好得多
.then(function(data) { /*resolved*/ })
.catch(function(err) { /*something bad happened*/ });