将单体 Express 路由拆分为领域路由
Devin 将一个 2,000 行的 Express 路由拆分为按领域划分的路由文件,并提取共享中间件 —— 然后更新所有 import 并确认所有测试全部通过。向 Devin 展示这个单体应用
你一定见过这样的文件——一个维护了一年半、越长越大的 Express 路由文件。每个业务域的每个接口都塞在 明确告诉 Devin 你希望目标结构是什么样的。
src/routes/index.ts 里:用户注册、支付 webhook、商品搜索全挤在一起。内联的鉴权检查被复制粘贴到了 40 个处理函数里。没人愿意动它,因为对订单逻辑的任何改动,都可能把上面三百行的用户相关接口改坏。这个文件顶部通常长这样:src/routes/index.ts (before — 2,000 lines)
通过约定引导 Devin
Devin 会阅读你的代码库以推断出模式,但在重构场景中,Knowledge 条目能带来最大的价值。为 Devin 需要遵循的约定添加条目:
- Router patterns — “每个业务域的 router 都使用
Router(),并在应用根部通过app.use('/domain', domainRouter)挂载” - Middleware — “认证中间件位于
src/middleware/中,并且始终通过导入使用,绝不内联定义” - Error handling — “所有路由处理函数都使用来自
src/lib/asyncHandler.ts的asyncHandler包装器——绝不直接使用裸 try/catch”
src/routes/admin.ts 中的模式,该文件已经实现了清晰的结构分离”。你也可以使用 Advanced Devin 为你生成 Knowledge 条目——只需描述你的约定,它就会创建结构良好的条目,供你审阅和保存。审查 Devin 的拉取请求(PR)
Devin 会为每个 endpoint 建立映射,跟踪导入关系图,提取共享逻辑,创建领域文件,重新配置根路由,并运行你的测试套件。一个典型的 PR 大致如下:这是拆分后精简的根路由配置:以及一个已正确导入共享中间件的域路由文件:所有 URL 路径保持不变 ——
src/routes/index.ts (after — 15 lines)
src/routes/orders.ts (after — excerpt)
/orders 现在由挂载在 /orders 下的 ordersRouter 处理,因此现有客户端和测试无需任何改动即可继续工作。(可选)检出该分支并在本地测试
对于这样的结构性重构,建议先拉取该分支,在本地验证无误后再合并。你可以在 Windsurf 或你常用的 IDE 中打开项目,启动应用,并访问几个接口,确认路由、中间件和错误处理的行为与之前完全一致。如果你发现有任何不对劲的地方,请在该 PR 上留下评论——Devin 会自动处理并推送修复。
