使用异步等待自动尝试捕获路由器控制器
Posted
技术标签:
【中文标题】使用异步等待自动尝试捕获路由器控制器【英文标题】:Auto try catch router controller with async await 【发布时间】:2018-04-11 12:26:03 【问题描述】:路由器:
router.get('/available', VehicleController.getAvailable)
router.put('/:vin/current-location', validate(vehicleValidation.currentLocation), VehicleController.saveCurrentLocation)
控制器
class VehicleController
async getAvailable (req, res, next)
try
res.json(await VehicleQueries.getAvailable())
catch (e)
next(e)
async saveCurrentLocation (req, res, next)
try
res.json(await VehicleQueries.updateLocation(req.params.vin, req.body.lng, req.body.lat))
catch (e)
next(e)
... etc etc
以上是使用新的 async 和 await 构建在 nodejs 中的简单 crud 应用程序。每条路由都会验证输入,然后传递给控制器。上面的示例调用另一个类中的方法,其中包含查询,而查询又返回一个承诺。
如您所见,我必须将每个控制器的代码包装在 try and catch 中。这变得相当烦人,我认为必须有一种更清洁的方法。
是否有可能以某种方式将控制器方法本身包装在 try catch 中?这样我可以将控制器简化为:
class VehicleController
async getAvailable (req, res, next)
res.json(await VehicleQueries.getAvailable())
async saveCurrentLocation (req, res, next)
res.json(await VehicleQueries.updateLocation(req.params.vin, req.body.lng, req.body.lat))
... etc etc
【问题讨论】:
【参考方案1】:您可以利用 rest paremeters 和 spread operator 构建一个函数来处理 try/catch
async executeQuery(res,next,queryFunction,...queryArguments)
try
res.json(await queryFunction(...queryArguments));
catch (e)
next(e);
async getAvailable (req, res, next)
executeQuery(res,next,VehicleQueries.getAvailable);
async saveCurrentLocation (req, res, next)
executeQuery(res,next,VehicleQueries.updateLocation,req.params.vin, req.body.lng, req.body.lat);
【讨论】:
是的,但对我来说,这感觉就像我将输出命令更深入地传递到应用程序中,现在将非常特定于查询类。如果有一个可以处理捕获的中间件会很棒。不知何故,路由器级别的东西,路由器尝试控制器,然后在接下来的 catch 调用中。而不是将责任传递给控制器,但我想不出该怎么做。 看起来他们在error handling middleware 上有指南我试图制作一个迷你应用程序来测试它,但没有运气。你可以试一试,看看它是否适合你 是的,我遇到了同样的问题,但感觉数据流是路由器 -> 动作 -> 错误处理程序。我的目标是路由器->尝试操作-> catchErrorHandler。如果我找到答案,我会在后面发帖。感谢您的帮助。以上是关于使用异步等待自动尝试捕获路由器控制器的主要内容,如果未能解决你的问题,请参考以下文章