如何最好地使应许拒绝像未捕获的异常一样?

时间:2018-07-16 07:42:32

标签: node.js promise

如果有未处理的Promise拒绝,Node.js当前仅记录一个错误,并提到将来此类错误将导致进程退出。

对此我有两个问题:

  1. 如何最好地使Node.js如今处理未处理的Promise拒绝,使其退出流程?
  2. 如果某些承诺的失败实际上与未捕获的异常相同并且应该导致退出流程,那么如何最好地做到这一点?

显然有很多方法可以做到这一点,但是我试图找到最干净,最简单的方法,不需要我为此功能创建新的实用程序库。

一些候选人:

  • runname-可能会令人困惑,因为没有任何东西表明它来自承诺,而不仅仅是抛出的异常,并且在process.on('unhandledRejection', (err) => { throw err; })中也不可用。
  • .catch()

1 个答案:

答案 0 :(得分:0)

在大多数情况下,当有serverexit时,您几乎不希望节点exceptionerror。错误处理程序(try/catch.catch())的工作就是确保即使存在exceptionerror时,服务器也能正常运行。

相反,当您获得exceptionerror时,您应该:

  1. catch,其中errorthrow是具有特定error消息(以及适合您的error代码)的自定义error
  2. catch在承诺链(或error)末尾的自定义app.use(err,...)并将该error消息发送给用户。

以下是一个简单的伪代码,用户向您提供XML,并期望将解析后的JSON作为响应:

function parseXML(xmlStr){
    return someParsingLibrary.parseXml2JSON(xmlStr)
        .catch(()=>{

            throw new Error("Your xml was not valid");
        })
}

app.post("/parse", function (req, res, next) {
    let xmlStr = req.body.xml;
    parseXML(xmlStr)
        .then((json)=>{
            res.status(200).send({description:"Success", body:json});
        })
        .catch((err)=>{
            res.status(422).send({description:err.message, body:err});
        })
});