目錄
- 資料庫設定
- 後端設定
- API實作
- 第 1 步:資料庫連線 (db/db.js)
- 第 2 步:環境變數 (.env)
- 第 3 步:輪詢控制器 (controllers/pollController.js)
- 第 4 步:投票路由 (routes/pollRoutes.js)
- 第 5 步:伺服器入口點 (index.js)
- 錯誤處理
- 測試
- 結論
請參考文章輪詢系統基礎底層設計-I
讓我們將整個過程分解為詳細的步驟,包括資料庫設定、使用 Node.js 和 Express 實作 API 以及與 MySQL 的交互。我們將涵蓋:
資料庫設定
首先,我們將定義 MySQL 資料庫的架構並建立必要的表。
MySQL 資料庫架構
雷雷
投票表:儲存帶有唯一識別碼、問題和建立時間戳記的投票資訊。
選項表:儲存與投票相關的選項,透過 poll_id 連結。
投票表:記錄每次投票,連結到民意調查、選項和使用者。
投票系統的 ERD
實體:
- Polls:代表投票本身,具有 poll_id 和 Question 等屬性。
- Options:代表每次投票可用的選項,具有 option_id 和 option_text 等屬性。
- Votes:表示使用者的投票數,具有vote_id、user_id、timestamps等屬性。
關係:
- 投票和選項之間的一對多:每個投票可以有多個選項。
- 投票和選項之間的多對一:每一票都與一個選項相關聯。
- 投票與民調之間的多對一:每張投票都與特定的民調相關聯。
這是 ERD 的描述:
投票表:
選項表:
- option_id(主鍵)
- poll_id(外鍵引用 polls.poll_id)
- 選項文字
投票表:
- vote_id(主鍵)
- poll_id(外鍵引用 polls.poll_id)
- option_id(外鍵引用 options.option_id)
- user_id
- 創建於
關係將以實體之間的線表示:
- 民意調查→選項:一項民意調查可以有多個選項。
- 選項→投票:一個選項可以有多個投票。
- 民調→投票:一項民調可以有很多票。
後端設定
讓我們使用 Express 和 MySQL 設定一個 Node.js 專案。
第 1 步:初始化項目
雷雷
- express:Node.js 的 Web 框架。
- mysql2:Node.js 的 MySQL 用戶端。
- dotenv:用於管理環境變數。
第 2 步:專案結構
為專案建立基本結構:
雷雷
API實作
步驟1:資料庫連接
檔案 - db/db.js
雷雷
第2步:環境變數
文件 - .env
雷雷
第 3 步:投票控制器
檔案-controllers/pollController.js
該檔案將實現輪詢系統所有必需的 CRUD 操作。
雷雷
第 4 步:投票路線
檔案-routes/pollRoutes.js
定義每個 API 端點的路由:
雷雷
第 5 步:伺服器入口點
檔案 - index.js
最後,設定伺服器:
雷雷
錯誤處理
每種方法都包含對常見問題的錯誤處理,例如無效輸入、重複投票、缺少投票或選項以及伺服器錯誤。
- 輸入驗證:執行檢查以確保輸入有效,例如檢查必填欄位是否存在且格式正確。
- 事務管理:對於涉及多個查詢的操作(例如建立或更新投票),事務用於確保一致性。
測試
使用Postman或curl等工具測試每個端點。
- 建立投票:使用包含問題和選項陣列的 JSON 正文來 POST /api/polls。
- 更新投票:PUT /api/polls/:pollId 更新問題和選項。
- 刪除投票: DELETE /api/polls/:pollId.
- 投票投票:使用 userId 和選項 POST /api/polls/:pollId/vote。
- 查看投票結果:GET /api/polls/:pollId/results。
結論
這是一個使用 Node.js、Express 和 MySQL 的線上投票系統的全面模組化實作。它處理基本的CRUD操作並確保資料與交易的一致性。它還包括基本的錯誤處理,使 API 更加健壯和用戶友好。
請參考文章輪詢系統基礎底層設計-I
更多詳情:
取得所有與系統設計相關的文章
標籤:SystemDesignWithZeeshanAli
系統設計與zeeshanali
Git:https://github.com/ZeeshanAli-0704/SystemDesignWithZeeshanAli
以上是底層設計:輪詢系統 - 使用 Nodejs的詳細內容。更多資訊請關注PHP中文網其他相關文章!