我正在用Node/Express编写一个注册系统,我正在尝试使用Promises。
问题是我在使用它们时收到错误消息:
错误:
(节点:64725) 未处理的承诺拒绝警告:未处理的承诺拒绝(拒绝 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');
});
});
}
});
您可以执行以下操作:
- 当您
- 想要打破承诺链时,抛出自定义错误。
- 签入
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);
}
});
注意。你不应该将回调与承诺混合使用,使用一些东西。在上面的例子中,我承诺req.login
,所以现在它返回一个承诺。
语言: JavaScript
为简单起见,只需使用:- ( 如果您不想进一步处理错误)
throw new Error("An error occured");
示例:-(获取)
fetch("endpoint/resource", requestOptions)
.then(response => {
if(response != null && response.status == 404) {
throw new Error("RECEIVED NULL OBJECT");
}
return response;
})
.then(approvedResponse => approvedResponse.blob())
.catch(e => console.log(e));
UnhandledPromiseRejectionWarning: Unhandle promise Rejection (rejection id: 2):我相信这是因为您没有办法处理初始 .thens 中的错误,因此您会得到上述错误。它不是"停止".then,而是正确处理错误。你可以做(err)=>{return},这基本上会"停止"它,但它在你的应用程序中的流量控制。