我试图在Node.js中链接一些Promise,但是仅用于jQuery Promise。我遇到的问题是当bcrypt
哈希失败时(我将代码更改为将字符串设置为null的方法),该函数的较高级函数(registerUser)似乎不会失败(进入catch处理程序)作为测试)。
我想完成的是
一个散列函数,返回一个promise,并记录其自身的失败
一个插入函数,返回一个promise,并记录其自身的失败
一个注册函数,该函数调用哈希,然后插入,并记录其中一个失败
这是我的代码。
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
处理程序。有点烂有成功的唯一处理程序吗?
答案 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);
});