自动尝试捕捉与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 

以上是使用新的asynchronous和等待在nodejs中构build的简单Crud应用程序。 每条路线validationinput然后传递到控制器。 上面的例子调用另一个类中包含查询的方法,这些查询又返回一个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 

你可以利用rest paremeters和spread运算符来构build一个函数来处理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); }