iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0
Modern Web

現在就學Node.js系列 第 14

Express.js Router 拆分 — 讓 API 更有架構 - Day14

  • 分享至 

  • xImage
  •  

昨天我們學習如何在單檔裡設計 /notes RESTful API。

今天我們把程式碼「模組化」,拆成 app.js(主程式)routes/notes.js(路由層)controllers/notes.js(控制器層)


📂 專案結構

project/
├── app.js              # 主程式
├── routes/
│   └── notes.js        # Router:定義路由
└── controllers/
    └── notes.js        # Controller:業務邏輯

1️⃣ app.js — 主程式

import express from "express";
import notesRouter from "./routes/notes.js";

const app = express();
app.use(express.json()); // 解析 JSON body

// 使用 notes 路由
app.use("/notes", notesRouter);

app.listen(3000, () => {
  console.log("🚀 伺服器運行中:http://localhost:3000");
});

2️⃣ routes/notes.js — Router 層

Router 的角色就是 URL 配置表,把不同的請求導到對應的控制器。

import express from "express";
import {
  getAllNotes,
  createNote,
  updateNote,
  deleteNote
} from "../controllers/notes.js";

const router = express.Router();

// GET /notes
router.get("/", getAllNotes);

// POST /notes
router.post("/", createNote);

// PUT /notes/:id
router.put("/:id", updateNote);

// DELETE /notes/:id
router.delete("/:id", deleteNote);

export default router;

3️⃣ controllers/notes.js — Controller 層

控制器負責「業務邏輯」,讓路由層保持乾淨。

這裡我們仍用記憶體中的假資料做示範。

let notes = [
  { id: 1, title: "第一則筆記" },
  { id: 2, title: "第二則筆記" }
];

// 取得所有筆記
export function getAllNotes(req, res) {
  res.json(notes);
}

// 新增筆記
export function createNote(req, res) {
  const newNote = { id: Date.now(), title: req.body.title };
  notes.push(newNote);
  res.status(201).json(newNote);
}

// 更新筆記
export function updateNote(req, res) {
  const note = notes.find((n) => n.id == req.params.id);
  if (!note) return res.status(404).json({ error: "找不到筆記" });

  note.title = req.body.title;
  res.json(note);
}

// 刪除筆記
export function deleteNote(req, res) {
  notes = notes.filter((n) => n.id != req.params.id);
  res.status(204).send();
}

架構流程圖

[Client 請求]
   │
   ▼
[app.js]
   │  app.use("/notes", notesRouter)
   ▼
[routes/notes.js]
   │  router.get/post/put/delete
   ▼
[controllers/notes.js]
   │  實作邏輯(CRUD)
   ▼
[Response 回傳 JSON 給 Client]

小結

  • Router → 負責「路由定義」
  • Controller → 負責「商業邏輯」
  • App 主程式 → 組裝 Express 與各路由模組

這樣拆分的好處:

  • 程式碼更乾淨,邏輯分工清楚
  • 功能擴充更容易(新增一個資源,就多一個 routes + controllers)
  • 後續可以再拆 Service / Model 層,逐步進化成 MVC 架構

上一篇
RESTful API 設計 - Day13
下一篇
Express.js MVC 架構
系列文
現在就學Node.js15
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言