我正在 Node/Express 中编写一个注册系统,并且我正在尝试使用 Promise。
问题是我在使用它们时收到错误消息:
错误:
(node:64725) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2):
有没有办法在then
处停下来?
auth.isRegistered(email)
.then((registered) => {
if ( !registered ) {
req.flash('pleaseRegister', 'Looks like you haven\'t registered. Please register first.');
req.session.user = user;
res.redirect('/register')
}
})
.then(() => {
return auth.isVerified(email);
})
.then((verified) => {
if ( !verified ) {
console.log('please verify');
res.redirect('/register/verify');
} else {
req.login(user, err => {
if ( err ) return next(err);
req.session.timestamp = Date.now();
auth.updateLastLogin(email)
.then(() => {
res.redirect(req.session.returnTo || '/account');
});
});
}
});
最佳答案
您可以执行以下操作:
- 当您想要破坏 promise 链时,引发自定义错误。
- 检查
catch
回调,发现抛出的错误是自定义错误。如果是这样,则继续,否则使用error
对象调用next
:
示例:
let getBreackChainError = () => {
let err = new Error();
err.name = 'BreackChainError';
return err;
};
auth
.isRegistered(email)
.then(registered => {
if (!registered) {
req.flash('pleaseRegister', 'Looks like you haven\'t registered. Please register first.');
req.session.user = user;
res.redirect('/register');
throw getBreackChainError();
}
return auth.isVerified(email);
})
.then(verified => {
if (!verified) {
console.log('please verify');
res.redirect('/register/verify');
throw getBreackChainError();
}
return new Promise((resolve, reject) => {
req.login(user, err => {
if (err) {
return reject(err);
}
req.session.timestamp = Date.now();
resolve();
});
});
})
.then(() => auth.updateLastLogin(email))
.then(() => res.redirect(req.session.returnTo || '/account');
.catch(err => {
if (err.name !== 'BreackChainError') {
next(err);
}
});
注意。您不应该将回调与 promise 混合在一起,而应使用其中之一。在上面的示例中,我 promise req.login
,所以现在它返回一个 promise 。
关于node.js - 破坏 promise 链 - 停止执行下一个 'then',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46610614/