如何在多重承诺上传递错误?

时间:2019-01-03 12:58:18

标签: javascript node.js ecmascript-6 promise es6-promise

因此,基本上,我试图通过传递错误值来创建错误处理程序,在我的情况下,该错误值是状态代码的数字,例如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,因此,如果您有任何更好的想法来改进我的代码,将不胜感激。

1 个答案:

答案 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;});