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

时间:2017-10-30 13:38:23

标签: javascript node.js asynchronous

路由器:

  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应用程序。每个路由验证输入然后传递到控制器。上面的示例在另一个包含查询的类中调用方法,而这些查询又返回一个promise。

正如你所看到的那样,我必须将每个控制器的代码包装在一个试试中并抓住......这会变得相当恼人,我认为必须有一个更清洁的方式。

是否有可能以某种方式将控制器方法本身包装在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 个答案:

答案 0 :(得分:0)

您可以利用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);
}