Javascript 错误总是需要承诺来拒绝吗?快速路线异常处理
我有下面的路径,它获取一些数据,然后存储在MongoDB中 路由器代码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
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
那么,采用这种方法可以吗?它是传统的吗?还是可以?这个问题有一个像样的答案,我同意:
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。