在承诺链中获得以前的结果(Q承诺)

时间:2016-06-15 19:11:30

标签: javascript node.js promise

我最近开始使用Promises,但我仍然没有得到一些东西。

让我举几个例子。

在Node& Mongo应用程序我正在尝试实现一个使用jwt令牌对用户进行身份验证的操作。该请求包含两个参数userNamepassWord。我需要做的是:

1)验证数据库中是否存在用户 2)如果用户存在,请验证数据库中的散列密码是否与请求中的纯文本提供的密码相匹配 3)如果两个密码匹配,则从我从数据库中获取的用户对象生成一个jwt令牌。

对于步骤 1)我已配置mongoose以使用Q promises。对于步骤 2)我使用bcrypt来比较两个密码,对于步骤 3)我使用节点jwt包来生成令牌。

我已经像这样隔离了代码(它只是一个概念证明):

// *** INSIDE AN API OBJECT *** //

 action : function(req, res) {
            return  User.findOne({ userName : req.body.userName }).exec()
                    .then(function(user){
                        // If the user doesn't exist return invalid credentials
                        var defer = Q.defer();
                        if (user) defer.resolve(user);
                        else defer.reject(new CError(400, E.INVALID_CREDENTIALS));
                        return defer.promise;
                        // returns user
                    })
                    .then(function(user){
                        // See if the password matches the hash
                        return Q.nfcall(bcrypt.compare(req.body.passWord, user.passWordHash);
                        // Returns true || false
                    })
                    .then(function(result){
                        // How do I obtain the user that was calculated two levels before ??
                        if (result) {
                            return Q.nfcall(jwt.sign, /* user */ , config.secret, {});
                        } else {
                            return Q.defer().reject(new CError(400, E.INVALID_CREDENTIALS));
                        }
                    })
                    .then(function(token){
                        res.json({token: token});
                    })
                    .catch(function(err){
                        if (err instanceof CError) {
                            res.status(err.status).json({ error : err.message });
                        } else {
                            res.status(500).json({ error : err.toString() });
                        }
                    })
                    .done();

        },

我现在遇到的“问题”是第三个then(),我应该生成jwt令牌的那个我无法访问user,这是在上面计算的两个级别。

我如何克服这个限制?

我有一些解决方案,但我不喜欢它们。实现这一目标的标准方法(如果存在)是什么?

1 个答案:

答案 0 :(得分:0)

我制作一个临时变量来存储它们..不确定这是否是正确的方法,但它一直对我有用。

 //in beginning of your function make the variable
    let _members;

    //promise chain
    .then(members=> {
          //store it in the variable and you can use it later
         _members = members
    }