已添加catch仍触发Mongoose/Typescript的UnhandledPromiseRejectionWarning
解决UnhandledPromiseRejectionWarning问题
你遇到的这个警告,问题出在你分别调用了Promise的.then()和.catch()方法,而不是将它们链式调用。
原因分析
当你像这样分开调用时:
let promise = Requirement.create({id: id, data: req.body.data, deleted: false}); promise.then((requirement) => { return res.json(requirement); }); promise.catch((reason) => { let err = {'error': reason}; return res.json(err); });
promise.then()会返回一个新的Promise对象。当原promise因为重复ID被拒绝时,.then()的回调不会执行,这个新的Promise会被拒绝,但你没有为这个新Promise添加错误处理,所以Node.js会抛出UnhandledPromiseRejectionWarning——尽管你已经用promise.catch()处理了原Promise的拒绝,但.then()返回的新Promise的拒绝没被处理。
修正方案
把.then()和.catch()链式调用在一起,这样.catch()会捕获原Promise的拒绝,同时也会捕获.then()回调中可能出现的任何错误:
router.post('/create/:id', jsonParser, (req: Request, res: Response) => { let { id } = req.params; if (!req.body) { return res.sendStatus(400) } // @TODO add validation on JSON Requirement.create({id: id, data: req.body.data, deleted: false}) .then((requirement) => { return res.json(requirement); }) .catch((reason) => { let err = {'error': reason}; return res.json(err); }); });
这样修改后,所有Promise链上的拒绝都会被最后的.catch()处理,就不会再出现那个警告了。
内容的提问来源于stack exchange,提问作者wii_coder
相关产品推荐
相关产品推荐

