You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:02:56