使用异步等待自动尝试捕获路由器控制器

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。如果我找到答案,我会在后面发帖。感谢您的帮助。

以上是关于使用异步等待自动尝试捕获路由器控制器的主要内容,如果未能解决你的问题,请参考以下文章

Vue路由器 - 捕获所有通配符不起作用

异步 new Vue() 等待初始认证

带有异步/等待和快速路由的 TypeError

Vue 路由:未捕获类型错误:window.Vue.use 不是函数

React-Router:如何在路由转换之前等待异步操作

Android(Kotlin) - 如何等待异步任务完成?