【问题标题】: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

【问题讨论】:

    标签: javascript node.js asynchronous


    【解决方案1】:

    您可以利用 rest paremetersspread 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。如果我找到答案,我会在后面发帖。感谢您的帮助。
    猜你喜欢
    • 2014-12-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2019-10-20
    • 2020-08-06
    • 2014-02-14
    • 2018-04-20
    • 2019-02-25
    相关资源
    最近更新 更多