Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 错误总是需要承诺来拒绝吗?快速路线异常处理_Javascript_Node.js_Promise - Fatal编程技术网

Javascript 错误总是需要承诺来拒绝吗?快速路线异常处理

Javascript 错误总是需要承诺来拒绝吗?快速路线异常处理,javascript,node.js,promise,Javascript,Node.js,Promise,我有下面的路径,它获取一些数据,然后存储在MongoDB中 路由器代码 router.post('/addPatient',async (req,res)=>{ let response = await patientRepo.addUser(req.body); res.send(response); }); 存储库代码 addUser = function(patientData){ return new Promise((resolve,reject)=&g

我有下面的路径,它获取一些数据,然后存储在MongoDB中

路由器代码

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


那么,采用这种方法可以吗?它是传统的吗?还是可以?

这个问题有一个像样的答案,我同意:

本质上,只要客户机(UI)意识到它需要挖掘响应,不管它是
200OK
,以潜在地挖掘错误代码和/或条件,那么这样做是完全合法的

另一种方法可能是不使用自动传递错误的
next
功能,而是手动设置错误代码,然后在响应对象中返回所需的JSON。在本例中,您将“适当地”使用HTTP状态代码,同时提供希望客户端使用的错误对象

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

也就是说,您需要在
catch
语句中
拒绝
,以便这些语句顺利通过。

应用程序中可能会出现两种错误:

  • 由于某些特定于应用程序的逻辑而导致的错误
  • 服务器本身引发的错误(DB错误、找不到文件等)
  • 我建议的是,第一类错误不应返回200以外的HTTP代码,因为您的服务器没有问题。第二个应该返回适当的代码,如400、500、404等


    希望这能有所帮助。

    这种说法有道理,但在这种情况下,我希望在自定义错误对象中发送500个响应,而不是使用由于数据库连接失败而由服务器生成的html模板,这样前端也可以知道这些错误代码/描述。您是在应用程序中使用ajax吗?是的,但是我也可以发布API供其他人使用。如果您想捕获服务器错误并自行处理,那么我认为您需要使用try/catch。