首页 > 解决方案 > 错误是否总是需要被 Promise 拒绝?快速路由异常处理

问题描述

我有以下路线获取一些数据,然后存储在 mongo db

路由器代码

router.post('/addPatient',async (req,res)=>{
    let response = await patientRepo.addUser(req.body);
    res.send(response);
});

存储库代码

addUser = function(patientData){
    return new Promise((resolve,reject)=>{
        openDbConn().then((db)=>{
            let patient = new Patient(patientData);
            patient.save()
            .then(item=>  resolve(status.STATUS_CODES.PATIENT_SAVE_SUCCESS))
            .catch(err => resolve(status.STATUS_CODES.PATIENT_SAVE_FAILED))  /*see this line*/
            .finally(()=> db.close());
        }).catch(dbErr=> resolve(dbErr));    
    });
}

我正在做的是我总是解决 addUser 函数的承诺,即使它失败了。因为,如果我要拒绝承诺,那么在我的路由器文件中,我必须像下面这样更改路由代码来处理被拒绝的承诺,

router.post('/addPatient',async (req,res,next)=>{
  try{
      let response = await patientRepo.addUser(req.body);
      res.send(response);
   }catch(err){
      next(err); /**This sends an html response generated by server for the error**/
   }
 });

场景是我想将我的自定义代码发送给客户端,如果出现任何异常,但是在拒绝承诺时,服务器会使用自定义 html 页面响应服务器内部错误 500。但是在解决时,我可以传递错误描述和代码因此路由器代码不需要try catch。

那么可以采用这种方法吗。它是传统的吗?或者好吗?

标签: javascriptnode.jspromise

解决方案


您的应用程序中可能会出现 2 种错误:

  1. 由于某些特定于应用程序的逻辑而导致的错误
  2. 服务器本身引发的错误(数据库错误、找不到文件等)

我的建议是第一种错误不应返回 200 以外的 HTTP 代码,因为您的服务器没有任何问题。第二个应该返回适​​当的代码,如 400、500、404 等。

希望这可以帮助。


推荐阅读