因此,基本上,我试图通过传递错误值来创建错误处理程序,在我的情况下,该错误值是状态代码的数字,例如400、500等。
现在的问题是当catch
捕获到错误时,该错误包含从先前的承诺返回的状态代码的值。当我记录该值时,它会正确记录该值,但是当我拒绝它并传递该值时,它将被下一个承诺的catch
捕获,它表示该值未定义。
这是错误代码:
UnhandledPromiseRejectionWarning:RangeError [ERR_HTTP_INVALID_STATUS_CODE]:无效的状态码:未定义
JS:
const findFromModel = async (model, query) => {
return new Promise((resolve, reject) => {
model = model instanceof Object ? model : {};
if (model) {
model.findOne(query, (err, obj) => {
if (obj) {
resolve(obj);
} else {
reject(400);
}
});
} else {
reject(400);
}
});
}
const makeOrder = async (title, body, userQuery) => {
return new Promise((resolve, reject) => {
title = (typeof title === 'string' && title.length > 0) ? title : '';
body = (typeof body === 'string' && body.length > 0) ? body : '';
if (title && body) {
findFromModel(userModel, userQuery)
.then(user => resolve(user))
.catch(err => {
console.log(err); // logs 400
reject(err); // Undefined
});
} else {
reject(400);
}
});
}
履行承诺:
makeOrder('test', 'this is body', {id: 'test'})
.then(obj => res.send(obj))
.catch(err => res.sendStatus(err.message));
我只是从es5转到es6,因此,如果您有任何更好的想法来改进我的代码,将不胜感激。
答案 0 :(得分:1)
如果您想使用async
函数,则可以减少代码量。
Promise
错误将成为异常,因此请使用try...catch
进行处理。
从async
函数返回实际上是resolve
的诺言,有效地reject
抛出错误。 (就像他们在Promise
中一样)
const makeOrder = async (title, body, userQuery) => {
title = (typeof title === 'string' && title.length > 0) ? title : '';
body = (typeof body === 'string' && body.length > 0) ? body : '';
if (title && body) {
try{
let user = await findFromModel(userModel, userQuery)
return user
}catch(err){
console.log(err); // logs 400
throw err;
}
throw 400;
}
}
即使您想使用旧的方法,通常也可以这样做
return findFromModel(userModel, userQuery)
.catch(err => {console.log(err); throw err;});