NodeJS错误处理-抛出错误承诺会尝试捕获

时间:2019-11-21 00:05:29

标签: node.js error-handling promise

我试图获取promise错误,然后抛出“ try catch”以将错误的返回集中在一个地方。

像这样:

async schedule(req, res) {
        try {

            //here is the function that returns a promise
            service.search()
                .then(async data => {

                    if (data.length > 0) {   
                            res.status(200).json("OK!");                        
                    }
                })
                .catch(async error => {
                   //here i want to throw this error to the "try catch" to return the error message
                   throw new Error(error);                  
                })

        }
        catch (error) {
            res.status(400).json(error);
        };

    }

但是当转到“ throw new Error(error);”时,会显示以下消息:

(node:15720) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
    warning.js:27

有人可以帮助我了解我做错了什么吗?

非常感谢!

拉斐尔

更新

基于Marcos的答案,我做到了:

async schedule(req, res) {
        try {

            const data = await service.search();                      

            if (data.length > 0) {   
                res.status(200).json("OK!");                        
            }               

        }
        catch (error) {
            res.status(400).json(error);
        };

  } 

工作了...现在我知道如何处理此错误了...谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将async/awaittry/catch.then/.catch结合使用,而不会同时使用两种方式。

async schedule(req, res) {
    try {

        //here is the function that returns a promise
        // If service.search rejects, it will go to the `catch`
        const data = await service.search()


        if (data.length > 0) {   
            return res.status(200).json("OK!");                        
        }
        // do something here
        // res.status(400).send('Invalid data')
        // throw new Error('Invalid data')

    } catch (error) {
        res.status(400).json(error);
    }

}

schedule(req, res) {
   service.search()
      .then(data => {

          if (data.length > 0) {   
                  res.status(200).json("OK!");                        
          }
      })
      .catch(error => {
          res.status(400).json(error);                 
      })
}