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

Node.js:如何避免控制器与服务层代码重复?

控制器重复代码的优化方案探讨

问题场景

我有多个控制器和服务层文件,其中存在大量重复代码。比如Banner控制器和Admin控制器中的status方法:

Banner控制器代码

const status = async (req: Request, _res: Response, next: NextFunction) => {
  const params: any = req.params;

  try {
    const response = await BannerService.status(params.id);

    if (!response.data) {
      return next(new RequestError(0))
    }

    return next(new RequestError(2))
  } catch (error) {
    return next(new RequestError(1))
  }
};

Admin控制器代码

const status = async (req: Request, _res: Response, next: NextFunction) => {
  const params: any = req.params;

  try {
    const response = await AdminService.status(params.id);

    if (!response.data) {
      return next(new RequestError(0))
    }

    return next(new RequestError(2))
  } catch (error) {
    return next(new RequestError(1))
  }
};

想请教:这种重复写法是否正确合规?还是更适合用全局通用函数来处理这类逻辑,比如下面的实现:

通用控制器函数方案

const statusController = (serviceFn) => {
  return async (req: Request, res: Response, next: NextFunction) => {
    const params: any = req.params;

    try {
      const response = await serviceFn(params.id);

      if (!response.data) {
        return next(new RequestError(0))
      }

      return next(new RequestError(2))
    } catch (error) {
      return next(new RequestError(1))
    }
  };
};

const adminStatus = statusController(AdminService.status);
const bannerStatus = statusController(BannerService.status);

分析与结论

  • 原始写法的问题
    语法上没问题,功能也能正常实现,但严重违反DRY(不重复造轮子)原则:两个方法除了调用的服务函数不同,其余逻辑完全一致。后续要改错误处理、参数逻辑时,得逐个修改所有重复的控制器方法,维护成本高,还容易漏改导致逻辑不一致,不符合工程化的规范要求。

  • 通用函数方案的优势
    这是更优的实现方式:

    1. 彻底消除重复代码,核心逻辑只需要维护一处;
    2. 所有派生的控制器方法逻辑完全统一,不会出现人为修改导致的差异;
    3. 后续扩展或修改逻辑时,只需要调整通用函数,所有关联控制器自动同步更新,效率极高。
  • 额外优化点

    • 给serviceFn加上类型约束,比如定义type StatusService = (id: string | number) => Promise<{ data?: any }>,避免传入不符合要求的服务函数;
    • 不要用params: any,可以明确类型,比如const { id } = req.params as { id: string },提升代码的类型安全性。

内容的提问来源于stack exchange,提问作者MHHH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:07:32