javascript - 错误是否总是需要被 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。
那么可以采用这种方法吗。它是传统的吗?或者好吗?
解决方案
您的应用程序中可能会出现 2 种错误:
- 由于某些特定于应用程序的逻辑而导致的错误
- 服务器本身引发的错误(数据库错误、找不到文件等)
我的建议是第一种错误不应返回 200 以外的 HTTP 代码,因为您的服务器没有任何问题。第二个应该返回适当的代码,如 400、500、404 等。
希望这可以帮助。
推荐阅读
- php - 对第 0 列数据的数据表搜索不在工具提示上
- c# - 为什么没有加载引导程序快速安装包
- vue.js - vue.js:将定期重复的后台查询放在哪里
- entity-framework-6 - 实体框架 - 无法创建引用同一个表的多个 DbContext。- 解决方法
- swift - 面试任务。我们将如何解决它?
- python - 如何在 python + 慢速学习模型中修复此代码的索引错误?
- c# - 在 Lambda 表达式中使用方法 - HTMLDoc
- python - 使用 Google Sheet API v4 和 Python 中的 batchUpdate 在 Google Sheet 上编写 DataFrame
- javascript - 如何在使用 javascript 禁用其他输入之前启用所有输入?
- r - 使用 lapply 时出现未定义列错误