Express后端:如何用包装函数优化路由重复的try-catch代码
解决Express路由中重复try-catch的冗余问题
你的问题核心在于:直接调用controllerWrapper导致它立即执行,而非返回一个Express路由所需的中间件回调函数。Express路由需要接收一个(req, res, next)格式的函数,而非函数执行后的结果。
正确的包装函数实现
修改controller-wrapper.js,让它返回一个符合Express要求的中间件函数:
// controller-wrapper.js function controllerWrapper(controllerFunc) { // 返回一个待执行的Express中间件 return async (req, res, next) => { try { const data = extractData(req); await controllerFunc(data); } catch (err) { // 将错误传递给Express的全局错误处理中间件 next(err); } }; }
路由中使用方式
在routes.js里,只需把控制器函数传入包装函数,直接作为路由回调:
// routes.js router.get('/', controllerWrapper(foo));
扩展:支持控制器使用req/res/next
如果你的控制器需要直接操作请求、响应对象或调用next,可以调整包装函数,将这些参数传递给控制器:
// 通用版包装函数 function controllerWrapper(controllerFunc) { return async (req, res, next) => { try { const data = extractData(req); // 把data、req、res、next都传给控制器 await controllerFunc(data, req, res, next); } catch (err) { next(err); } }; }
对应的控制器可以这样写:
// controllers.js async function foo(data, req, res, next) { // 示例:使用res返回处理后的数据 res.status(200).json({ result: data }); }
内容的提问来源于stack exchange,提问作者Ahmet Yazıcı
相关产品推荐
相关产品推荐

