后端开发指南

backend-dev-guidelines
分类通用
作者Agentic Awesome Skills 社区
许可MIT
评分4.60/5
使用6.9K

后端开发指南

(Node.js · Express · TypeScript · 微服务)

你是一位资深后端工程师,在严格的架构和可靠性约束下运行生产级服务。

你的目标是构建可预测、可观测且易于维护的后端系统,采用以下方案:

  • 分层架构
  • 明确的错误边界
  • 强类型与校验
  • 集中式配置
  • 一等公民级别的可观测性

本指南定义了后端代码必须如何编写,而非仅仅是建议。

---

1. 后端可行性与风险指数 (BFRI)

在实现或修改后端功能之前,请先评估其可行性。

BFRI 维度 (1–5)

| 维度 | 问题 |
| ----------------------------- | ---------------------------------------------------------------- |
| 架构适配度 | 是否遵循 路由 $\rightarrow$ 控制器 $\rightarrow$ 服务 $\rightarrow$ 仓库 的流程? |
| 业务逻辑复杂度 | 领域逻辑的复杂度如何? |
| 数据风险 | 是否影响关键数据路径或事务? |
| 运维风险 | 是否影响鉴权、计费、消息传递或基础设施? |
| 可测试性 | 是否能可靠地进行单元测试 + 集成测试? |

评分公式

code
BFRI = (架构适配度 + 可测试性) − (复杂度 + 数据风险 + 运维风险)

范围: -10 → +10

结果解读

| BFRI | 含义 | 采取行动 |
| -------- | --------- | ---------------------- |
| 6–10 | 安全 | 直接执行 |
| 3–5 | 中等 | 增加测试 + 监控 |
| 0–2 | 有风险 | 重构或隔离 |
| < 0 | 危险 | 编码前重新设计 |

---

使用场景

在处理以下内容时自动适用:
  • 路由 (Routes)、控制器 (Controllers)、服务 (Services)、仓库 (Repositories)
  • Express 中间件
  • Prisma 数据库访问
  • Zod 校验
  • Sentry 错误追踪
  • 配置管理
  • 后端重构或迁移

---

2. 核心架构准则 (不可逾越)

1. 强制执行分层架构

code
Routes → Controllers → Services → Repositories → Database
  • 禁止跳层
  • 禁止跨层泄漏
  • 每层仅承担单一职责

---

2. 路由仅负责路由

ts
// ❌ 绝不要这样做
router.post('/create', async (req, res) => {
  await prisma.user.create(...);
});

// ✅ 始终这样做
router.post('/create', (req, res) =>
userController.create(req, res)
);

路由中必须包含零业务逻辑

---

3. 控制器负责协调,服务负责决策

  • 控制器 (Controllers):

* 解析请求
* 调用服务
* 处理响应格式化
* 通过 BaseController 处理错误

  • 服务 (Services):

* 包含业务规则
* 与框架无关
* 使用依赖注入 (DI)
* 可进行单元测试

---

4. 所有控制器必须继承 BaseController

ts
export class UserController extends BaseController {
  async getUser(req: Request, res: Response): Promise<void> {
    try {
      const user = await this.userService.getById(req.params.id);
      this.
handleSuccess(res, user); } catch (error) { this.handleError(error, res, 'getUser'); } } }
code
禁止在 BaseController 辅助方法之外直接调用 res.json

---

5. 所有错误必须上报至 Sentry

ts catch (error) { Sentry.captureException(error); throw error; }
code
console.log
❌ 静默失败
❌ 吞掉错误

---

6. unifiedConfig 是唯一的配置源

ts // ❌ 严禁使用 process.env.JWT_SECRET;

// ✅ 始终使用
import { config } from '@/config/unifiedConfig';
config.auth.jwtSecret;

code
---

7. 使用 Zod 验证所有外部输入

  • 请求体 (Request bodies)
  • 查询参数 (Query params)
  • 路由参数 (Route params)
  • Webhook 负载 (Webhook payloads)
ts const schema = z.object({ email: z.string().email(), });

const input = schema.parse(req.body);

code
没有验证 = 必然有 Bug。

---

3. 目录结构 (标准)

src/ ├── config/ # unifiedConfig ├── controllers/ # BaseController + 控制器 ├── services/ # 业务逻辑 ├── repositories/ # Prisma 访问层 ├── routes/ # Express 路由 ├── middleware/ # 鉴权、验证、错误处理 ├── validators/ # Zod 模式定义 ├── types/ # 共享类型 ├── utils/ # 辅助函数 ├── tests/ # 单元测试 + 集成测试 ├── instrument.ts # Sentry 初始化 (必须最先导入) ├── app.ts # Express 应用 └── server.ts # HTTP 服务器
code
---

4. 命名规范 (严格执行)

| 层级 | 命名约定 |
| ---------- | ------------------------- |
| Controller | PascalCaseController.ts |
| Service | camelCaseService.ts |
| Repository | PascalCaseRepository.ts |
| Routes | camelCaseRoutes.ts |
| Validators | camelCase.schema.ts |

---

5. 依赖注入规则

  • Service 通过构造函数接收依赖
  • Controller 内部禁止直接导入 Repository
  • 旨在支持 Mock 和测试
ts export class UserService { constructor( private readonly userRepository: UserRepository ) {} }
code
---

6. Prisma & Repository 规则

  • Prisma 客户端 严禁直接在 Controller 中使用
  • Repository 职责:

* 封装查询
* 处理事务
* 暴露基于意图的方法 (Intent-based methods)

ts
await userRepository.findActiveUsers();
code
---

7. 异步与错误处理

必须使用 asyncErrorWrapper

所有异步路由处理器必须被包裹。

ts
router.get(
'/users',
asyncErrorWrapper((req, res) =>
controller.list(req, res)
)
);
code
禁止出现未处理的 Promise 拒绝 (unhandled promise rejections)。

---

8. 可观测性与监控

必须包含

  • Sentry 错误追踪
  • Sentry 性能追踪
  • 结构化日志 (适用场景)

所有关键路径必须可观测。

---

9. 测试纪律

必须编写的测试

  • Service 的 单元测试
  • 路由的 集成测试
  • 复杂查询的 Repository 测试
ts describe('UserService', () => { it('creates a user', async () => { expect(user).toBeDefined(); }); }); ``

没有测试 $\rightarrow$ 不予合并。

---

10. 反模式 (直接拒绝)

❌ 路由中包含业务逻辑
❌ 跳过 Service 层
❌ Controller 直接调用 Prisma
❌ 缺失输入验证
❌ 直接使用
process.env
❌ 使用
console.log` 代替 Sentry
❌ 业务逻辑缺乏测试

---

11. 与其他技能的集成

  • frontend-dev-guidelines $\rightarrow$ API 契约对齐
  • error-tracking $\rightarrow$ Sentry 标准
  • database-verification $\rightarrow$ Schema 正确性
  • analytics-tracking $\rightarrow$ 事件流水线
  • skill-developer $\rightarrow$ 技能开发指南
治理

---

12. 运维验证清单

在完成后端工作前:

  • [ ] BFRI ≥ 3
  • [ ] 遵循分层架构
  • [ ] 输入已验证
  • [ ] 错误已在 Sentry 中捕获
  • [ ] 使用了 unifiedConfig
  • [ ] 已编写测试
  • [ ] 无反模式 (Anti-patterns)

---

13. 技能状态

状态: 稳定 · 可执行 · 生产级
预期用途: 承载真实流量且具有真实风险的长期运行 Node.js 微服务
---

使用场景

当任务需要执行概览中所描述的工作流或操作时,适用此技能。

局限性

  • 仅在任务明确符合上述范围时使用此技能。
  • 不要将输出结果视为针对特定环境的验证、测试或专家评审的替代方案。
  • 如果缺少必要的输入、权限、安全边界或验收标准,请停止操作并寻求澄清。