結論先講
選後端框架就像選車,不是馬力最大的就最好,而是要看你開在什麼路上。但不管你選哪台,安全帶、煞車、後視鏡這些基本配備一定要有。
這篇列出一個成熟後端框架(以及用這個框架建出來的專案)應該具備的 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-Afterheader
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 用
比較表:四大後端框架
| 功能 | Django | Express | Spring Boot | FastAPI |
|---|---|---|---|---|
| 語言 | Python | JavaScript/TS | Java/Kotlin | Python |
| ORM | Django ORM(內建) | 需套件(Prisma、TypeORM) | JPA/Hibernate(內建) | 需套件(SQLAlchemy) |
| Migration | 內建 | 需套件 | Flyway/Liquibase | Alembic |
| Validation | Django Forms/DRF Serializers | Zod/Joi | Bean Validation | Pydantic(內建) |
| Auth | 內建(功能完整) | Passport.js | Spring Security | 需自己做 |
| Rate Limit | 需套件 | express-rate-limit | Bucket4j | slowapi |
| WebSocket | Django Channels | ws/socket.io | Spring WebSocket | 內建 |
| API Docs | DRF + drf-spectacular | swagger-jsdoc | Springdoc | 自動產生 |
| Job Queue | Celery | BullMQ | Spring Batch | Celery/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 的基本要求。
系列導航
| # | 文章 | 狀態 |
|---|---|---|
| 01 | 好的前端專案該有什麼?一張體檢表 | |
| 02 | 好的後端框架需要具備哪些功能? | 📍 你在這裡 |
| 03 | 好的 API 該長什麼樣? | |
| 04 | 好的資料庫設計需要什麼? | |
| 05 | 好的基礎建設需要什麼? | |
| 06 | CD Pipeline 需要什麼? | |
| 07 | 好的監控系統需要什麼? | |
| 08 | 好的開發者體驗(DX)需要什麼? |