在创建工厂服务时,return$http.post在angular中到底意味着什么

what exactly does return $http.post mean in angular when creating a factory service?

本文关键字:angular 什么 意味着 post 工厂 创建 服务 return http      更新时间:2023-09-26

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

假设我有一个node/express后端,并且使用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
                        });    

我的问题是:我的思路正确吗?我一直在阅读和重读关于这方面的有棱角的文件,尽管它让我松了一口气,但我忍不住认为我在这里遗漏了一些东西。

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

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*/ });