Node JS承诺链

时间:2018-10-20 17:23:00

标签: javascript jquery node.js

我试图在Node.js中链接一些Promise,但是仅用于jQuery Promise。我遇到的问题是当bcrypt哈希失败时(我将代码更改为将字符串设置为null的方法),该函数的较高级函数(registerUser)似乎不会失败(进入catch处理程序)作为测试)。

我想完成的是

  1. 一个散列函数,返回一个promise,并记录其自身的失败

  2. 一个插入函数,返回一个promise,并记录其自身的失败

  3. 一个注册函数,该函数调用哈希,然后插入,并记录其中一个失败

这是我的代码。

hashPassword(password){
    let self = this;
    // if you set password to null, the catch err is printed.
    // but in registerUser, .then() is still called...
    return bcrypt.hash(password, 10)
        .then(function(hash) {
            return hash;
        })
        .catch(function(err){
            self.logger.error('failed to hash password');
        });
}

insertUser(email, passwordHash){
    let self = this;
    let data = {
        email: email,
        password: passwordHash
    };
    return this.collection.insertOne(data)
        .then(function(res) {
            self.logger.info(`user ${email} registered`);
        })
        .catch(function(err){
            self.logger.error('failed to add user to db');
        });
}

registerUser(email, password){
    let self = this;
    return this.hashPassword(password)
        .then(function(hash){
            // is this returning the promise of 
            // insertUser to the caller of registerUser?
            return self.insertUser(email, hash);
        })
        // which promise am i catching here?
        .catch(function(){
            self.logger.error('failed to register user');
        });
}

最后有人调用了register函数,应该知道它是否成功。

let user = new User();
user.registerUser('a@b.com', '1234')
   .then(function(){
       res.sendStatus(200);
   })
   .catch(function(){
      res.sendStatus(400);
   });

我想我已经意识到我期望then是成功的处理程序,但它也是error处理程序。有点烂有成功的唯一处理程序吗?

2 个答案:

答案 0 :(得分:1)

catch处理错误,因此,如果您发现错误,则不会传播。如果您希望该错误继续到更深的catch块,则需要从catch返回被拒绝的承诺。像这样:

hashPassword(password){
    let self = this;
    // if you set password to null, the catch err is printed.
    // but in registerUser, .then() is still called...
    return bcrypt.hash(password, 10)
        .then(function(hash) {
            return hash;
        })
        .catch(function(err){
            self.logger.error('failed to hash password');
            // Pass on the error
            return Promise.reject('failed to hash password')
        });
}

您将需要为仅需要副作用但实际上不希望“捕获”错误的任何catch执行此操作。

答案 1 :(得分:0)

创建函数,以便它们返回承诺

    createHash(email, password){
        let self = this;
        return this.hashPassword(password);            
    }

首先创建哈希,然后对返回的诺言使用,然后在then处理程序中返回create user,然后返回另一个诺言,并在用户创建后使用另一个诺言,然后在其上发送响应。如果发生任何错误,则捕获将返回400。

    let user = new User();
    user.createHash('a@b.com', '1234')
      .then(function(hash){
          return self.insertUser(email, hash);              
      })
      .then((user) => res.sendStatus(200))
      .catch(function(error){
         res.sendStatus(400);
      });