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(不重复造轮子)原则:两个方法除了调用的服务函数不同,其余逻辑完全一致。后续要改错误处理、参数逻辑时,得逐个修改所有重复的控制器方法,维护成本高,还容易漏改导致逻辑不一致,不符合工程化的规范要求。通用函数方案的优势
这是更优的实现方式:- 彻底消除重复代码,核心逻辑只需要维护一处;
- 所有派生的控制器方法逻辑完全统一,不会出现人为修改导致的差异;
- 后续扩展或修改逻辑时,只需要调整通用函数,所有关联控制器自动同步更新,效率极高。
额外优化点
- 给
serviceFn加上类型约束,比如定义type StatusService = (id: string | number) => Promise<{ data?: any }>,避免传入不符合要求的服务函数; - 不要用
params: any,可以明确类型,比如const { id } = req.params as { id: string },提升代码的类型安全性。
- 给
内容的提问来源于stack exchange,提问作者MHHH
相关产品推荐
相关产品推荐

