You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ı

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 01:31:04