結論先講

選後端框架就像選車,不是馬力最大的就最好,而是要看你開在什麼路上。但不管你選哪台,安全帶、煞車、後視鏡這些基本配備一定要有

這篇列出一個成熟後端框架(以及用這個框架建出來的專案)應該具備的 15 項功能。不管你用 Django、Express、Spring Boot 還是 FastAPI,都可以拿來對照。


體檢清單

1. ORM + Migration

手寫 SQL 沒問題,但你需要有個系統化的方式管理資料庫結構變更。

# Django migration 範例
class Migration(migrations.Migration):
    dependencies = [('users', '0001_initial')]
 
    operations = [
        migrations.AddField(
            model_name='user',
            name='avatar_url',
            field=models.URLField(null=True, blank=True),
        ),
    ]
  • 有 ORM 或 query builder
  • Migration 系統(可追蹤、可回滾)
  • Seed data 機制

2. Middleware / Interceptor

請求進來到回應出去之間,你需要能在中間插入邏輯。

  • 全域 middleware(logging、CORS、compression)
  • 路由級 middleware(auth、rate limit)
  • 可以控制執行順序
// Express middleware 範例
app.use(cors());
app.use(helmet());
app.use(rateLimiter);
app.use('/api/admin', authMiddleware, adminOnly);

3. Request Validation

永遠不要相信前端送來的資料。

# FastAPI + Pydantic
class CreateUserRequest(BaseModel):
    name: str = Field(min_length=1, max_length=100)
    email: EmailStr
    age: int = Field(ge=0, le=150)
 
@app.post("/users")
async def create_user(body: CreateUserRequest):
    ...
  • Schema-based validation(Pydantic、Zod、Joi 等)
  • 自動回傳驗證錯誤訊息
  • 支援巢狀物件驗證

4. Authentication(JWT / OAuth)

  • JWT 或 Session-based 驗證
  • Refresh token 機制
  • OAuth 2.0 / OIDC 整合(Google、GitHub 等)
  • 密碼雜湊(bcrypt/argon2,不是 MD5 拜託)

5. Authorization(RBAC)

驗證是「你是誰」,授權是「你能做什麼」。

  • 角色系統(admin、editor、viewer)
  • 資源級權限(只能編輯自己的文章)
  • Permission middleware 或 decorator
# Django 風格
@permission_required('articles.can_publish')
def publish_article(request, article_id):
    ...

6. Rate Limiting

  • 全域 rate limit(例如 100 req/min per IP)
  • API 級 rate limit(登入 API 更嚴格)
  • 回傳 429 Too Many Requests + Retry-After header

7. Logging(Structured)

{
  "timestamp": "2026-03-15T10:30:00Z",
  "level": "error",
  "message": "Payment failed",
  "userId": "usr_123",
  "orderId": "ord_456",
  "error": "insufficient_funds",
  "traceId": "abc-def-ghi"
}
  • 結構化日誌(JSON format)
  • 不同環境不同 log level
  • Request ID / Trace ID 串接
  • 不要 log 敏感資料(密碼、信用卡號)

8. Error Handling(Consistent Format)

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Invalid input",
    "details": [
      { "field": "email", "message": "Invalid email format" }
    ]
  }
}
  • 統一錯誤回應格式
  • 區分 client error 和 server error
  • Production 不洩漏 stack trace

9. Caching

  • Response cache(Redis / Memcached)
  • Database query cache
  • Cache invalidation 策略
  • HTTP cache headers(ETag、Cache-Control)

10. Job Queue / Scheduler

有些事不該在 request-response 裡做(寄信、產報表、影片轉檔)。

  • 非同步 job queue(Celery、BullMQ、Sidekiq)
  • 排程任務(cron-like)
  • 失敗重試機制
  • Job 狀態追蹤

11. WebSocket

  • 即時通訊支援
  • 連線管理(heartbeat、reconnect)
  • 房間 / 頻道概念

12. File Upload

  • 檔案大小限制
  • 檔案類型驗證(不是只看副檔名)
  • 上傳到 object storage(S3、GCS)
  • 產生 presigned URL

13. API Documentation(OpenAPI)

  • 自動從程式碼產生 API 文件
  • Swagger UI 或 ReDoc
  • 範例 request/response

14. Testing Utilities

  • Test client / test runner 內建
  • Database fixtures / factory
  • Mock 外部服務的工具

15. Health Check Endpoint

// GET /health
{
  "status": "healthy",
  "version": "1.2.3",
  "uptime": "3d 4h 12m",
  "checks": {
    "database": "ok",
    "redis": "ok",
    "storage": "ok"
  }
}
  • GET /health 端點
  • 檢查所有相依服務
  • 給 load balancer / k8s 用

比較表:四大後端框架

功能DjangoExpressSpring BootFastAPI
語言PythonJavaScript/TSJava/KotlinPython
ORMDjango ORM(內建)需套件(Prisma、TypeORM)JPA/Hibernate(內建)需套件(SQLAlchemy)
Migration內建需套件Flyway/LiquibaseAlembic
ValidationDjango Forms/DRF SerializersZod/JoiBean ValidationPydantic(內建)
Auth內建(功能完整)Passport.jsSpring Security需自己做
Rate Limit需套件express-rate-limitBucket4jslowapi
WebSocketDjango Channelsws/socket.ioSpring WebSocket內建
API DocsDRF + drf-spectacularswagger-jsdocSpringdoc自動產生
Job QueueCeleryBullMQSpring BatchCelery/ARQ
學習曲線中等
適合場景全端、CMS、快速原型輕量 API、微服務企業級、大團隊高效能 API

哪個適合你?

  • Django:要快速做出完整產品,有 admin 後台需求
  • Express:前端工程師兼做後端,或微服務架構
  • Spring Boot:企業環境、Java 團隊、需要嚴格型別
  • FastAPI:需要高效能 API、Python 生態圈、ML/AI 後端

實戰範例:Express 專案的 app 結構

src/
├── config/           # 環境設定
│   ├── database.ts
│   └── env.ts
├── middleware/        # 全域 middleware
│   ├── auth.ts
│   ├── errorHandler.ts
│   ├── rateLimiter.ts
│   └── validate.ts
├── modules/           # 功能模組
│   ├── users/
│   │   ├── user.controller.ts
│   │   ├── user.service.ts
│   │   ├── user.schema.ts    # Zod validation
│   │   ├── user.model.ts     # DB model
│   │   └── user.test.ts
│   └── orders/
├── jobs/              # Background jobs
│   ├── sendEmail.ts
│   └── generateReport.ts
├── utils/
│   ├── logger.ts
│   └── errors.ts
└── app.ts

FAQ

Q1: 小專案要選「大而全」還是「小而美」的框架?

小專案選 Express 或 FastAPI 這種輕量的就好。Django 和 Spring Boot 的「batteries included」在大專案才會真正發揮價值。但要注意:小專案會長大,選框架的時候也要考慮擴充性。

Q2: ORM 效能不好怎麼辦?

ORM 在 90% 的場景下效能夠用。剩下 10% 的複雜查詢,直接寫 raw SQL 就好。不要因為「ORM 慢」就完全不用,那是因噎廢食。

Q3: JWT 和 Session 哪個好?

JWT 適合 stateless API(尤其是微服務間通訊),Session 適合傳統 web app。如果你的 API 同時給 web 和 mobile 用,JWT 比較方便。但 JWT 不能主動撤銷,要搭配 refresh token + blacklist。

Q4: 一定要用 Redis 做快取嗎?

不一定。小專案用 in-memory cache(node-cache、lru-cache)就好。Redis 的優勢在於跨 instance 共享和持久化,適合分散式架構。

Q5: Health check 真的有人看嗎?

有。Kubernetes 的 liveness/readiness probe 就是靠它。Load balancer 也會用它來判斷要不要把流量導過來。這個 endpoint 是 DevOps 的基本要求。


系列導航