路由器:
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
答案 0 :(得分:0)
您可以利用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);
}